Separate line lexing into FileLexer

Instead of handling the nesting of parens as states in the core lexer,
we now handle it in an outer layer which should also make it easier to
handle indentation later. This also changes the semantics so that
programs always end with a newline token.