Lexer lookup tables

Added hash tables for faster lookup of reserved words and punctuation.
This also decreases the clutterness of nested if statements. Binary ops
are kept in a switch block to handle binops that are longer than 1
character (e..g. &&).