Rewrite the parser

Add a separate tokenization stage before parsing. The parser now loops
through tokens instead of individual characters. This is simpler, and
makes it easier to use context in parser decisions.

Errors no longer include the column number, although that could be added
back later.
Fix some style issues

* Use `sizeof *var` instead of `sizeof (type)`.
* Use implicit booleans instead of `== NULL` or `!= NULL`.