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).
It is redundant for the time being, but I don't expect it to remain redundant, as things build ontop of this, so personally I think keeping the copied tests is a good idea.

That said, obviously it depends on what you think. But IMHO, even if it's a bit redundant to begin with doesn't mean it will be forever