Add abstract lexer interface, and complete-as-possible parser