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
I posted this before, but it got lost in an update:

Can someone point me to the spec that describes the check @stefanpenner posted? I've looked at [this site](http://promisesaplus.com/), but that says that the promise itself can be an object or a function, which doesn't match the suggested approach.

That said, I'd like to simplify this, since we expect tests to only return `undefined` and promises, nothing else:

```js
promise = this.callback.call( this.testEnvironment, this.assert );
if ( promise && typeof promise.then === "function" ) {
  [...]
}
```