updateProgressWithNextThenQueue() {
    // we need to grab the first item in the queue without shifting it off 
    // because setState is asyncronous and we rely on the value of
    // `this.state.progress` to determine if we add to the queue or not
    const next = this.queued[0];
    this.setProgress(next, Date.now(), () => {
      this.queued.shift();
      if (this.queued.length === 0) return;
      const minTime = next.minDuration != null ? next.minDuration : this.MIN_TIME_EACH_PROGRESS_UPDATE;
      this.nextProgressUpdateTimer = setTimeout(this.updateProgressWithNextThenQueue, minTime);
    });
  }
Updates the local state `progress` with the next item in the queue
then starts a timer to set the item after that in the queue, if 
there is one. If the queue is empty when this is called `undefined` 
will be set. So don't do that.