Cleanup handling of complex requests

Most interceptors with a request phase just need to manipulate the
request object. Occasionally, an interceptor needs to be more invasive
during the request phase. The request handler can now return a
ComplexRequest object that contains the canonical request object along
with any extras.

In addition to the request object, a ComplexRequest may also contain an
abort promise or a custom client to override the client chain.

interceptor = require('rest/interceptor');
return interceptor({
    request: function (request, config) {
        var abortTrigger = when.defer();
        ...
        return new interceptor.ComplexRequest({
            request: request,
            abort: abortTrigger.promise
        });
    }
});