Rewrite parser to use recursive descent

Also, Concatenate and Alternate nodes are now stored as vectors rather
than binary trees.  This prevents stack overflow on long inputs.