Added a retry to adb

[repasting my comment here since the new commit made it disappear:]

nice thought to use async.retry! the way you're invoking it isn't quite right here though. from their docs on the second argument:

> task(callback, results) - A function which receives two arguments: (1) a callback(err, result) which must be called when finished, passing err (which can be null) and the result of the function's execution, and (2) a results object, containing the results of the previously executed functions (if nested inside another control flow).

you're passing `exec(cmd, opts)` as the second argument. this isn't a function, but the result of executing exec (which will be undefined). what you really want is something like this:

```js
async.retry(retryNum, function (_cb) {
  exec(cmd, opts, function (err, stdout, stderr) {
    if (err) {
      // all the retryCheck logic here
      if (retryCheck) return _cb(new Error(stderr)); // get back into retry loop
      return cb(err); // shortcut retry and fall out since we have a non-recoverable error
    } else {
      cb(null, stdout, stderr); // shortcut retry and respond with success
    }
  });
}, function (err) {
   if (err) return cb(err); // if we retry too many times, we'll get the error here
   // the success case is handled in the retry loop
});
```

but you'll notice, this involves duplicating all the logic outside of async.retry. What this suggests is that this entire method should basically *start* with async.retry. Wanna take a stab at rearchitecting it that way?