Revert back from AST to token gap-buffer and index-based parsing

A tree is useful for emitting, but makes parsing very complex. On top of
that parsing based on pointers is just stupid, a) you always have to
ensure to check for NULL, which makes easy look ahead/back impossible,
and b) when inserting/deleting nodes you risk dangling pointers.

The main purpose of the AST, to make high-level parsing/replacing easier,
can still be done with the old token gap-buffer/index-based parsing
approach; the tokens of low-level constructs can be merged into a single
high-level token, e.g.
	(#) (include) (string, "file")  ->  (ppinclude, "file")
and instead of building a tree structure out of child tokens, they could
be marked or be surrounded by special TK_BEGIN/END tokens...