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.

Criticism or other suggestions welcomed, as usual.

cc: @domenic @stefanpenner
Should I be preferring `QUnit.objectType( then ) === "function"` here rather than using the raw JS?  I don't see any benefit to that [when checking for a `function`] other than consistency with other parts of the library but we're pretty inconsistent across the board right now.