fix(ngEventDirs): blur and focus use $evalAysnc to prevent inprog errors

Request Type: bug

How to reproduce: 

- ng-click triggers focus() on an element that has ng-focus 
- ng-key* triggers blur() on an element that has ng-blur 
- moving an element  in an ng-repeat  that has ng-blur before the preceding item

Component(s): 

Impact: medium

Complexity: medium

This issue is related to: 

**Detailed Description:**



**Other Comments:**

This fixes cases where ngFocus and ngBlur will throw $rootScope.inprog errors, because they have been called during an active digest. There are (at least) three scenarios where this can happen, see above

ng-click triggers focus() on an element that has ng-focus
ng-key* triggers blur() on an element that has ng-blur
moving an element with ng-blur in an ng-repeat before the preceding item

There's some discussion about this in #5402

I'd say we give it a shot and see if it causes any problems. Using $evalAsync was suggested by @caitp in https://github.com/angular/angular.js/issues/4979#issuecomment-35659108 .

Fixes #5945
Closes #5402
@Narretz can you please refactor this PR to use  `if (!scope.$$phase) {...}`.

We can't use evalAsync because that desynchronizes the DOM event from our event handler, which means that the event will bubble up by the time we call the the user code to respond to it.

I'm definitely not crazy about this solution, but it's better than the alternatives.

oh and also, instead of creating duplicate forEach loop, just check the phase and then either call apply or don't.