refactor lexer to have type of (Token.t * Pos.t, 'a) Reader.t

parser hasn't been refactored yet so everything but the lexer is broken atm