Correctly validate string escape characters

The control errors in string were never actually being raised, and the
continued lexing would not output an appropriate string if an error did
occur. Now backslashes are escaped when outputting strings, and invalid
characters are included as Unicode replacement characters.

Closing quotes in errors were being consumed by the terminal escape
code, so a space is now placed between the end of the output and the
escape code.
Handle number literal bases other than sixteen

The hexadecimal number literal notation now handles any number from 2 to
36 before the 'x', extending the number literal characters that follow
an 'x' to the full alphabet. A number token will verify that the
characters are valid for the given base before continuing. The runtime
definition for creating numbers has been updated to parse different
bases.