Use a token hierarchy instead of string types

The lexer and unicode modules have been moved under the parser, and the
lexer tokens are now distinguished by constructor rather than by a
string type. They now have a much more consistent string representation
and location information, and the parser uses unlocated tokens to report
missing tokens. A number of untested parse failures have been added.
Unify variable definitions and test their patterns

The hoisted and unhoisted variable definitions are now unified into the
same evaluation. Both the initial value and assigned values are tested
against the definition's pattern.
Use value equality, fix number operators

String and number equality now tests against the primitive value instead
of object identity. The number operators used an invalid pattern, which
has now been fixed.
Remove : as an operator, make return types strict

The : symbol is now banned as an operator. Names in return types were
consuming the body of the method as a block, so they are now also
strictly parsed.