fixed regex manipulation in lexer
coalesced regexes that match the same token type
refactored tokenize()

Now it collects all token objects in advance and then constructs a rollbackable iterator over them.

There's no need to store line:col information in the position object.  It can be simply an int.
abandoned position object: {line, col, code}

line, col, and code are now just variables