Modified parser to support operators

Operators can be overloaded by assigning to the `ops` table
before function is compiled. The `ops` table is used for looking up
operators which are then directly encoded in the compiled bytecode.

Currently there is no support for directly inlining such opcodes,
which would greatly speed up common operations, but this scheme allows
such an optimization to be added in the future.

Due to the ability to overload an combination of opcode characters, much
like haskell, precedence is handled differently than other languages.

By default, operators are evaluated left to right. No special cases
are made for operators that normally have implied precedence.
    1+2*3 => 9
    -1+2 => 1

However, spacing can be used to indicate different precedence around
operators. Because the precendence is defined lexically, the parser is
considerably simplified.
    1 + 2*3 => 7
    - 1+2 => -3

If you don't care for whitespace sensitivity, parenthesis can be used
as is common for other languages.
    1+(2*3) => 7
    -(1+2) => -3