Taskify portions of the parser, making it async

The larger parts of the parser are now asynchronous, using the Task API.
This means that the parser will also be non-blocking. It should also
ease a transition to a token stream rather than manually splitting
tokens synchronously. The token operations remain synchronous for now.

The callback method on tasks can now handle undefined and null values,
and the prelude will report its module name if an error occurs.