Intercept

Just opening this for review and discussion of the intercept API. Not ready to merge.

Jist:

```javascript
inject(Http, function(http) {
  http.globalInterceptors.response.push(function(err, req, res) {
    // The response interceptors should only be operating on the response,
    // but the request is available for context
    res.body = 'foo body';
    return res;
  });
});
```
Also supports returning a promise for async interception.

TODO:
 
 * The intercept function is a little too node-y, not very promisy. e.g. all response/responseError interceptors get added to the same queue, and have an optional first argument for err, much like a node callback. This API should be adapted to use separate resolve/reject handlers. Perhaps the API could allow pushing a tuple to `globalInterceptors[type]`, such as `http.globalInterceptors.response.push({resolve: someFunc, reject: someFunc});`
 * Add more tests for more cases
 * Stop using zones for testing ConnectionMock/PromiseBackend, just patch promise global in beforeEach and afterEach. Zones add needless bloat to tests, with no value.
 * Clean up PR (squash commits, resolve issues with upstream commits, etc)

> When you say, "shouldn't be assignable," you're referring to the globalInterceptors+.response + .request not being directly assignable (leaving the arrays to still be pushed, popped, whatever)? Makes sense to me.

Yeah, I think it's better if there's a guarantee that the interceptors collection always refers to the same object, so that we don't introduce weird bugs later on (having different things using different collections of interceptors, hard-to-debug weirdness)

> Assuming we limited the API for adding/removing as suggested, would you pass in a reference to the function to be removed to the remove method? globalInterceptors.response.remove(myFunc);

It would be pretty cool if you could also give interceptors names, but yeah a function reference should work too