Async: Implement new `assert.async` mechanism

Fixes #534.

**Typical Usage Example:**

```js
QUnit.test( "x", function( assert ) {
  assert.expect( 1 );
  var done = assert.async();
  setTimeout(function() {
    assert.ok( true );
    done();
  }, 250);
});
```

This PR should now be merged before #634 (which I will then rebase).
I need some clarity on this comment.  I interpret this to mean **all** of the following:

 1. Pre-2.0, we should change the behavior of `QUnit.start` to:
     1. Not use a semaphore at all if outside of Test context
     2. Throw an error if called more than once _EVER_ outside of Test context
     3. Throw an error if called when `QUnit.config.autostart === true`
 2. Pre-2.0, we should change the behavior of `QUnit.stop` to:
     1. Not use a semaphore at all if outside of Test context
     2. Throw an error if called _EVER_ (not even _once_) outside of Test context

Does this all sound accurate?