feat($http): add request interceptors

Request interceptors are promise-based and can be registered
analogously to response interceptors. For backwards compatibility,
requests are handled exactly as before when no interceptors are
registered.

When request interceptors have been registered, the interceptors
are prependend to the promise chain returned by $http. The
interceptor promises will be resolved or rejected before the
request is sent out and passed the request's transformed config
object; therefore, the interceptors are able to change everything
about the request before it is actually sent. This makes Angular
play nice with many advanced requirements (e.g., complex
authentication or analytics).

Because the interceptors use promises, this approach is extremely
flexible. For instance, it is possible to make additional requests
before sending a requests by injecting new promises into the chain.

Closes #929

This commit also adds tests that cover the initial implementation.
Since request interceptors utilize promisesi, tests involving the
mocked $httpBackend need to make an extra call to $rootScope.$apply
for the intercepted requests to register with $httpBackend.