feat($q): Add optional canceler and promise.cancel method

Add an optional argument to $q.defer to provide a canceling function.
This will expose a promise.cancel method that can be used to call the
canceling function and reject the promise.

See existing implementations in Dojo Toolkit and Promised-IO library
for reference.