PR of initial master commits

Sorry, was not clear here..

monotonicCalculator() is a function which can be overridden by the developer. As such, we should support a callback pattern because we don't know what the developer will need to do in their implementation of monotonicCalculator (e.g. a DB query) which may be asynchronous. 

If the calculation of the value for delay is part of the logic provided by the module, then it should probably not be part of the monotonicCalculator function as this adds an overhead to the developer to know they need to include this calculation. 

e.g.
```
instance.monotonicCalculatorRunner = function(callback) {
  instance.monotonicCalculator(function(delay) {
    delay = delay >= this.getMaxDelay ? this.getMaxDelay : delay;
    return callback(delay);
  }
}

// overload this to do your own logic 
instance.monotonicCalculator(callback) {
  var delay = Math.round(this.getDelay() * 1.5);
  return callback(delay);
}
```