feat($q): add streamlined ES6-style interface for using $q

This potentially helps lead the way towards a more performant fly-weight
implementation, as discussed earlier in the year. Using a constructor means we
can put things in the prototype chain, and essentially treat $q as a Promise
class, and reuse methods as appropriate.

Short of that, I feel this style is slightly more convenient and streamlined,
compared with the older API.

Related to #6427

(This doesn't do what was requested in #6427, however I feel it's a better
solution as it looks similar to the newer native Promise implementations becoming common
in the web platform).
did you just copy all of these tests and refactored them to use `Q`?

most of these tests look redundant to me. All that we want to test here is that the constructor will be called with resolve and reject functions which resolve or reject the promise. Everything else is the standard promise behavior which is already being tested elsewhere.. no?