Refactor Tokens to improve performance and lower memory usage

Tokens no longer store an object representing their contents. Instead, they
store an integer UUID mapping to the object lexeme they represent. This works
out to be roughly the same for character tokenization (Character wrapper
overhead pads out beyond a byte) and more efficient for Whitespace and Line.

Furthermore, we no longer need to do a string compare to establish equality,
and instead can compare token type and UUID - an integer and enum. Should be
much more efficient.

Signed-off-by: Matthew Heon <mheon@redhat.com>
Convert Submission to an interface to make decorator implementation more elegant

Signed-off-by: Matthew Heon <mheon@redhat.com>
Small bugfixes and performance optimizations

Signed-off-by: Matthew Heon <mheon@redhat.com>