we should allow more than just strings as input.
this will allow stratifying our parsing. so we could make one parser that lexes a string, and then a second parser that parses the tokens from the lexer into an ast
maybe even go farther and implement micropass compilers etc.