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.
I think if you have 2^18 handlers on a single promise, you have bigger problems to worry about though, it's not really  something that matters.