Change the async body boilerplate.

Previously: the boilerplate created a completer, scheduled a microtask
to run the translated body, and returned the future of the completer.
The microtask used the completer to complete the future with a value or
error as appropriate.

Now: the boilerplate creates and returns a Future directly via new
Future.microtask.  The future completes with a value by returning a
value, and completes with an error by throwing an exception.
Fix bugs in the translation, verify against tests.
Merge pull request #36 from kmillikin/boilerplate

Boilerplate