Make context.dispatchException logic a bit more readable.
Simplify nonlocal control flow using completion records.

The notion of a completion record is introduced in section 6.2.2 of the
ES6 draft spec: "The Completion type is a Record used to explain the
runtime propagation of values and control flow such as the behaviour of
statements (break, continue, return and throw) that perform nonlocal
transfers of control."

Although the spec details how completion records should be dynamically
evaluated for all kinds of expressions and statements, the Regenerator
implementation only needs to know about abrupt completion records
associated with try statements.

The biggest benefit for Regenerator from this revamp is that we no longer
have to build chains of nested finally entries to jump through as we
return from a function or break/continue out of a loop/switch statement
body. Instead, we set the desired completion record (say, breaking to a
location just after a while loop) and, if there is one or more finally
blocks in the way, control proceeds to the closest one. The code generated
for that finally block is now responsible for enacting the original
completion behavior when the finally block is done executing (provided
that behavior has not been overridden by some other nonlocal control
transfer, such as returning from the finally block). If other finally
blocks need to be executed, the same logic applies again.

This revamp pushes more control flow logic into the runtime than I would
like, so I'm going to work on reducing the amount of code in
runtime/dev.js in subsequent commits.