Rewrite of the macro handling in the lexer.

The lexer did some flawed macro expansion when encountering macro calls in actual arguments.
The rewrite parses defines upfront into "preprocessor tokens", thus removing a lot of messy
logic when the define is expanded/called.

Also various grammar fixes and many new tests.