Simplify interpreter and implement core runtime

A number of definitions that were not specific to the interpreter have
been moved out of the interpreter prototype and into either the runtime
or tasks. Most importantly, the 'apply' method has been moved to the
runtime, which allows it to be used in the primitive definitions without
any reference to an interpreter. An interpreter no longer has stores
whether or not it is asynchronous, and method application is
asynchronous.

Synchronous methods are wrapped into a task that will immediately
resolve. Asynchronous methods may be executed immediately by calling a
special 'now' method on the task that is returned from the apply
function. Note that 'now' is not a force method, as the task is not
guaranteed to actually complete as a result of invoking it (and there is
no error if it does not), it simply bypasses the call to setImmediate
by running the function directly.

The test suite is halved by the change, as there is no longer any
synchronous behaviour to test. When synchronous methods are introduced,
they may be tested manually.

The primitive definitions of the runtime have also been fleshed out.
Currently they assume that methods are asynchronous (as there are no
synchronous methods yet) but it would be nice in the future to ensure
this assumption with proxies.