Control flow - at long last

This is admittedly quite a big hunk for review!

The changes introduce the concept of `ShellStatus` is a sort of "enhanced" version of `ExitCode` used as the return value from internal shell operations, and special built-ins. This supports operations producing shell errors, which specific semantics in the spec.

It is also used to support break, continue, exit, and return. These special built-ins now produce status values that cause the execution machinery to perform these control-flow operations.

Along the way there was considerable clean up of where some types and functions lived.

There are some known infelicities with adherence to corners of the spec:
 * break or continue with n greater than nest depth "overshoots"
 * expansion errors (parameter expansion and command substitution) aren't propagated
 * syntax errors for the special builtins don't `shellError`
 * the web ui doesn't exit on exit