Make $digest async

Request Type: refactor

How to reproduce: 

Component(s): scope

Impact: large

Complexity: medium

This issue is related to: 

**Detailed Description:**

We think it's important to lesser the stress on $digest in angular, thus 
we suggest to refactor $digest implementation, and make it asynchronous.

**Other Comments:**

With this in mind we've introduced several changes in our branch.

1. $q service is extended with several methods to support building of asynchronous algorithms.
    These are: 
      promise.thenIf();
      promise.thenWhile();
      promise.thenDoWhile();
      promise.thenForEach();
      promise.thenFor();
      $q.run();

  In theory we would prefer to refactor this service more greatly but we decided to introduce minimal additions there.

2. Introduces $scheduler service that provides:
  a) nextTick() a implementation to runs deferred objects in batches until they fit in a time slot, and 
      then continue the remaining part after some sleep;
  b) q factory;

3. rootScope's $digest(), $watchCollection(), and ngRepeater's watch action logics are refactored.

4. schedulerSpec, and asyncDigestSpec tests are created.
    Some other tests are fixed.

5. rootScopeProvider has asyncDigest property (false is default) to preserve backward compatibility.