Async: Implement new `assert.async` mechanism

Fixes #534.

**Typical Usage Example:**

```js
QUnit.test( "x", function( assert ) {
  assert.expect( 1 );
  var done = assert.sync();
  setTimeout(function() {
    assert.ok( true );
    done();
  }, 250);
});
```

This PR should now be merged before #634 (which I will then rebase).
use pushFailure instead, if there's no current test it's the best option here