WIP STAGING for #8300 [[no-merge]]

Staging ground for $q improvements in #8300, this is a work in progress.

The work is in 3 stages, each building on the previous stage:

1. Add constructor for promises (ES6-style interface, landed in f3a763fd2edd8a37b80c79a5aaa1444460cd2df7)
2. Port subset of functionality from [Bluebird](github.com/petkaantonov/bluebird), we can now get a perf improvement by sticking methods used for each promise in the prototype chain and avoid creating garbage.
3. Modify the error logging behaviour to be similar to Bluebird, by only logging an error for unhandlde rejections.

This is somewhat challenging, as promises in $q currently behave somewhat inconsistently (sometimes rethrowing errors, sometimes not, etc), and it will take some time to finalize this. Hence, staging ground.
Of course, it is pretty important for readability, this also has no real performance impact. A clever minifier like the closure compiler should take care of it anyway. If it doesn't - Bluebird utilizes an AST pass as a part of the build to perform some simple transformations - a similar approach can reduce file size if that's the concern.