code: function Queue(name, opts, fn) {
    if (typeof opts === 'function') fn = opts;
    this.name = name;
    this.id = uuid();
    this.fn = fn;
    this.maxItems = opts.maxItems || Infinity;
    this.maxAttempts = opts.maxAttempts || Infinity;
  
    this.backoff = {
      MIN_RETRY_DELAY: opts.minRetryDelay || 1000,
      MAX_RETRY_DELAY: opts.maxRetryDelay || 30000,
      FACTOR: opts.backoffFactor || 2,
      JITTER: opts.backoffJitter || 0
    };
  
    // painstakingly tuned. that's why they're not "easily" configurable
    this.timeouts = {
      ACK_TIMER: 1000,
      RECLAIM_TIMER: 3000,
      RECLAIM_TIMEOUT: 10000,
      RECLAIM_WAIT: 500
    };
  
    this.keys = {
      IN_PROGRESS: 'inProgress',
      QUEUE: 'queue',
      ACK: 'ack',
      RECLAIM_START: 'reclaimStart',
      RECLAIM_END: 'reclaimEnd'
    };
  
    this._schedule = new Schedule();
    this._processId = 0;
  
    // Set up our empty queues
    this._store = new Store(this.name, this.id, this.keys);
    this._store.set(this.keys.IN_PROGRESS, {});
    this._store.set(this.keys.QUEUE, []);
  
    // bind recurring tasks for ease of use
    this._ack = bind(this._ack, this);
    this._checkReclaim = bind(this._checkReclaim, this);
    this._processHead = bind(this._processHead, this);
  
    this._running = false;
  }
docs: @callback processFunc
  @param {Mixed} item The item added to the queue to process
  @param {Function} done A function to call when processing is completed.
  @param {Error} Optional error parameter if the processing failed
  @param {Response} Optional response parameter to emit for async handling
   
  Constructs a Queue backed by localStorage
  
  @constructor
  @param {String} name The name of the queue. Will be used to find abandoned queues and retry their items
  @param {processFunc} fn The function to call in order to process an item added to the queue