Another refactor: split the AST into pre-AST (the one where all statements are linearized and independent, and only know their indentation) and the actual hierarchical AST. Removing stupid code feels good, should've done that long time ago!
@rburchell I have indentation-defined scoping (like python), which sadly makes the grammar not context-free. You can get around this by parsing each line as an independent statement (recording the indentation as well), and then resolving the scoping in a separate finilization pass.
So, pre-AST is what the raw parser outputs, then the finilization pass turns it into the actual AST.