Break chains of futures arising from await in a loop.

Await inside a loop can create arbitrarily long chains of futures.
Break these at the point of the loop's continue function, but ignoring
the return value from continue and instead communicating completion
values or errors via a Completer per loop.

This is awkward because calls to .then() from await inside a loop need
to install an error handler to propagate errors to the completer.

Two important things change about the implementation:

  * Return continuations previously had type `unit -> unit`, now they
    have type `expr -> expr`.  Before they had the side effect of
    emitting a sequence of statements that always ended with a
    `return`.  Now we need to be able to wrap the subexpression of the
    `return`, so they have the side effect of emitting a sequence of
    statements (the same as before) and returning the subexpression of
    the `return`.

  * Break and continue labels previously were strings, because they
    were always named functions.  Now we need to ability to wrap them
    so that they generate code, so they have type `unit -> unit`.
Incorporated review comments.
Merge pull request #52 from kmillikin/break-chains

Break chains of futures arising from await in a loop.
Handle returns consistently.

Inside a loop or a try/catch, returns were not handled properly.  They
now have the side effect of emitting instructions, but return an
expression denoting the return value.  This needs to be handled
properly at sites that invoke the return continuation.
Merge pull request #53 from dart-lang/break-chains

Handle returns consistently.
A fix for a bug with return from finally.

The return from finally was abstracted twice.
Merge pull request #54 from dart-lang/bugfix

A fix for a bug with return from finally.