Replace tight loops in clientsForSentry with chained calls

clientsForSentry has a nested pair of forEach loops which very likely will starve the nodejs event loop when a sentry is deemed to be down.  Replace the loops with a chain of N x M calls that iterate through the userIds/clientIds in the same way.

/cc @zendesk/zendesk-radar

### Steps to merge
 - [ ] :+1: of the team

### References
 - Jira link: https://zendesk.atlassian.net/browse/RADAR-435

### Risks
 - Low: clientsForSentry does not respond to sentry down as expected
This is still very much C-like.

Suggestion: Do not deal with this here, deal at one level above. For example:

```
PresenceStore.prototype.clientsForSentry = function(sentry) {
  var map = this.map, clientIds = [];
  Object.keys(map).forEach(function(userId) {
    Object.keys(map[userId]).forEach(function(clientId) {	 
       var data = map[userId][clientId];
       if(data && data.sentry == sentry) {
          clientIds.push(clientId);
       }
    }
  }
  return clientIds;
}
```
This above deals with getting all the clients for that sentry. Since it is simply reading a hash-map and comparing some values, all in memory, it is pretty fast. (Our trouble was the callback processing happening all in same function)

Then, wherever we are using it,  we make sure it is done in a chained sequence. For example:

```
var clientIds = store.clientsForSentry(sentry);

var chain = function(clientIds) {
   var clientId = clientIds.pop();
   if(!clientId) return;
   manager.sentryDownForClient(clientId);
   setImmediate(function() {
     chain(clientIds);
  });
};
chain();
```