Started work on a new math parser.

This parser is different in a few key areas.
1. It parses to an intermediate representation.
   This IR is made up of a sealed trait and some case classes.
   The point being that it's way easier to test this way, and
   we decouple code generation from parsing.
2. MOTHER FUCKING PACKRAT PARSERS
   By mixing in the PackratParsers trait and reworking the structure
   of the parsing code in general, we are able to use packrat parsers
   which memoize the parsing internally leading to faster parse times
   and more importantly, enabling us to write left-recursive parsers.