Async: Tests are now 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.

Criticism or other suggestions welcomed, as usual.

cc: @domenic @stefanpenner
Thanks for clarifying. The reasoning is explained in [this note](http://promisesaplus.com/#point-75), which seems odd, but okay to follow.

Since we have to check if `promise` is defined first, this still needs to be a bit more complicated then I outlined above.