Handle async code in TestRunner correctly.

This fixes the issues we were having with test print outs and also
not being able to run mocha directly on a directory. There were a
couple of issues:

1. We weren't stopping our calls to the next part of the test when
we failed one part.
2. Asserts in async code in Mocha fail really badly (uncaught assertions)
so instead of asserting fails we report an error to Mocha which fails
the test gracefully.