make context and arguments be passed through thunk

this is kind of an opinionated PR and it would break compatibility (though we already broke it by removing arguments). instead of doing `co.call(this, gen)(args..., done)`, we now "compose" a generator function into a regular asynchronous function. the signature would now be `co(gen).call(this, args..., done)`. so:

```js
co(function *(a, b, c) {

})
```

returns:

```js
function (a, b, c, done) {

}
```

i always thought it was weird how you call `this` and the arguments in different parts. 

now, co returns a reusable function. now users don't have to `require('co')` just to consume it.  it would also make koa's callback simpler:

```js
app.callback = function(){
  var mw = [respond].concat(this.middleware);
  var run = co(compose(mw));
  var self = this;

  return function(req, res, next){
    var ctx = self.createContext(req, res);
    run.call(ctx, next || ctx.onerror);
  }
};
```