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).
But wait, that actually _shouldn't_ work.  Each step (e.g. `beforeEach`) is expected to synchronize itself before the next step begins (e.g. test callback).