code: function repeater(handleError, defaultTimeout, maxTimeout) {
    let currentTimeout = defaultTimeout;
    return function(read) {
      return function readable(end, cb) {
        let propogate = end !== null ? handleError(end) : true;
        if (propogate) {
          currentTimeout = defaultTimeout;
          read(end, function (end, data) {
            cb(end, data)
          });
        } else {
          setTimeout(function() {
            read(null, function (end, data) {
              cb(end, data)
            });
          }, currentTimeout);
          currentTimeout = Math.min(currentTimeout * 2, maxTimeout);
        }
      }
    }
  }
docs: Simple through stream until it encounters
  an error from downstream. Than it asks handleError:
  if it returns true, than it will go for retry. Each consecutive retry
  will double timeout until next retry with max value as maxTimeout.
  
  After first successful retry timeout will become defaultTimeout.
  
  It will always propagate upwards errrors to downstream.