code: function _drainQueueStep(queue) {
      var fn = queue.shift();
      if (typeof fn !== "function") {
          fn._settlePromises();
      } else {
          var receiver = queue.shift();
          var arg = queue.shift();
          fn.call(receiver, arg);
      }
  }
docs: Shift the queue in a separate function to allow garbage collection after each step