Remove the asPrimitiveString method on non-strings

The asPrimitiveString method was implemented on booleans and numbers as
a convenience. This confused the print() method, as it was identifying
these objects as strings, and not requesting the asString method. This
interfered with inheritance, where the asString method may be overridden
and return a different string representation than the one provided by
asPrimitiveString. Now only strings have the asPrimitiveString method.
Ensure a task stop cannot overflow the call stack

The stop method on tasks recursively descended through the tasks until
it found the one that was running. Large chains of dependent tasks could
cause this recursion to overflow the stack, producing an error instead
of stopping the task. Now the recursion uses the asap function to clear
out the stack at each step.
Replace custom Unicode data with npm module

The existing unicode module was large and unwieldy, as well as somewhat
inefficient. Now the project dependencies includes Unicode 7 data, which
provides regex for matching character classes. The unicode module no
longer exports name information, and the lexer just reports the actual
character in case of an unrecognised character. The 'escape' function
has been moved to the util module.