Async: Make tests Promise-aware

Fixes #632.
Ref #534.

~~I'm **not** loving how un-DRY the `Test#run` function is... but that's not _new_, only exacerbated by this PR.~~

**Updated:** This makes the `setup`, `teardown`, and `test` methods all aware that their return value may be a Promise in need of asynchronous resolution (`resolve`-ing).

Criticism or other suggestions welcomed, as usual.

cc: @domenic @stefanpenner
It's an extra tab. There are three ways to tell: 1) Just visually noticing massive amounts of space; 2) highlight the indentation, there are actual tabs so you can count; 3) add `?ts=4` to the URL to change the tab size. :-)