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.
If there's an overflow (which is extremely unlikely to happen in any real world application), we are replacing index0 with a the proxy and receiver --- but only partially, the promise and handlers aren't replaced with nothing, as they are in non-overflow cases. This is pretty much self-evident from reading the code