parser.act: Use a hash table for token interning in the parser.
parser.act: Use a hash table for token interning in the parser.

The parser's token interning dominates everything else when profiling
large test data sets, because previously it was walking an entire linked
list of tokens to find matches.

Switch to an add-only hash table with separate chaining for the tokens,
and grow whenever any of the chains are longer than MAX_CHAIN_LENGTH.

amend: use xcalloc, not calloc.

katef/libfsm,katef/libfsm,katef/libfsm,katef/libfsm,katef/libfsm