Adds `it.async` DSL for testing async operations.

Async tests should return a Promise object. This code wraps the `it`
function body into a wrapper that calls `QUnit.start` and `QUnit.stop`
as required when the promise resolves or rejects.

The signature is, `it.async(description, body[, timeout])`

The default timeout is 1 second. If you pass a third argument, it
becomes the time (in ms) to wait until the promise resolves.

Example:

```javascript
it.async('with model that returns a promise', function() {
  var promise = model.find('foo').then(function(result) {
    expect(result).to.equal('foo');
  });

  return promise;
});
```
I feel like that'd be too brittle to maintain. Tests don't run at the same speed on all machines, or even on the same machine with different load. Ideally your test suite would know about the previous runs and how long each test took and use that as a dynamic timeout, but… that's clearly a larger project.