fix($timeout/$interval): if invokeApply is false, do not use evalAsync

$evalAsync triggers a digest, and is unsuitable when it is expected that a
digest should not occur.

BREAKING CHANGE

Previously, even if `invokeApply` was set to false, a $rootScope digest would occur during promise resolution. Workarounds include manually triggering `$scope.$apply()`, or returning `$q.defer().promise` from a promise callback, and resolving or rejecting it when appropriate.

```js
var interval = $interval(function() {
  if (someRequirementFulfilled) {
    $interval.cancel(interval);
    $scope.$apply();
  }
}, 100, 0, false);
```

or:

```js
var interval = $interval(function (idx) {
  // make the magic happen
}, 1000, 10, false);
interval.then(function(idx) {
  var deferred = $q.defer();
  // do the asynchronous magic --- $evalAsync will cause a digest and cause
  // bindings to update.
  return deferred.promise;
});
```
I feel it introduces more concepts to have in mind while reading the test, but that's just me.