Preferably before we implement new AST features, we should finish up user error handling in the parser. That is, the parser should always either accept code or reject it with an explanation, and NEVER crash by throwing an internal zig error. Legitimate internal failures like OOM should be handled and printed.