Overhaul of AST generation, AST rewrite rules, syntactic predicates

Grammar has been rewritten so that every parse rule which produces an AST node does so via a rewrite rule for consistency and ease of port to the tree grammar.

Many rules have been expanded and unfactored then refactored via syntactic predicates instead to separate semantically separate parse matches into separate rules which can then have AST rewrite applied individually on each match (instead of the former regex-OR chain).

Grammar now passes all test cases provided which should work, and gracefully fails test cases that should fail.

Closes #39.