1. Have the runner yield the final set of failures instead of
raising them, this allows the same yield syntax to be used
for all exit points that the runner run_iter() produces and
now raise failures from the main engine run loop to match this
change.
2. Use a context manager instead of try/finally to start and
stop the action engines task executor (teenie niceness...)
3. When the engine run_iter() is used and the generator that is
returned is closed, instead of breaking from the run loop, which
can leave running tasks incomplete instead continue running and
signal to the runner that the engine has suspended itself. This
ensures that the running atoms are not lost when the generator from
run_iter() is closed (for whatever reason) before finishing.
Also adds a bunch of useful tests that directly test the runner instead
of the indirect testing that we were doing before.
Fixes bug 1361013
Change-Id: I1b598e26f0b3877c8f7004f87bacdb7f5e9c9897