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
if we can to be pedantic (with little cost) we can make the promise usage more spec aligned by not accessing `then` more then once. 

```js
if (promise !==null && typeof promise == 'object') {
  var then = promise.then;
  if (type then === 'function') {
    then.call(promise, ....);
  } 
}
```