Ensure token tidying occurs in lexer

The lexer wasn't tidying up tokens that ended the input, resulting in
strange behaviour such as keywords being interpreted as identifiers. Now
the token loop takes one more pass at the end of input with the
character as null, which ends every token.
Remove null return from token poll in parser

Polling the parser for the next token was returning null when there were
no more tokens to produce, which produced unhelpful errors when the
input unexpectedly ended. Now the parser always produces an 'end of
input' token once the input has ended.
Add import and extend interpreter interface

The interpreter now supports loading modules directly. This allows it to
handle both import statements as well as provide a module loading method
as part of its external interface. The module loader can be customised
by providing a function to the interpreter when it is constructed, but a
default using the Node.js file system is available. This default is also
exported so it can called by a custom module loader. Modules are cached
in the interpreter and paths are normalised to ensure that overlapping
imports are not processed more than once.

The interpreter cloning mechanism has been modified to use JavaScript's
prototyping rather than directly copying across all of the constants
into the clone.

The command-line script has been updated to include options to allow
defining the root of the module hierarchy, which sets up a custom
module loader. The root can also be derived from the directory of the
main module.
Add dialect scoping and interactive modules

Dialects are now parsed and interpreted, loading the requested module
and replacing the default prelude with the resulting object.

The main script now accepts an option to indicate interactive mode that
can be combined with a file name to load that module as the dialect of
the REPL. A new 'enter' method on the interpreter allows the creation of
a consistent object as the self value for the interactive mode.