code: function captureCallback(nodeFire, eventType, callback) {
    const key = eventType + '::' + nodeFire.toString();
    callback.$nodeFireCallbacks = callback.$nodeFireCallbacks || {};
    callback.$nodeFireCallbacks[key] = callback.$nodeFireCallbacks[key] || [];
    const nodeFireCallback = function(snap, previousChildKey) {
      // eslint-disable-next-line no-invalid-this
      runGenerator(callback.call(this, new Snapshot(snap, nodeFire), previousChildKey));
    };
    callback.$nodeFireCallbacks[key].push(nodeFireCallback);
    return nodeFireCallback;
  }
docs: We need to wrap the user's callback so that we can wrap each snapshot, but must keep track of the wrapper function in case the user calls off().  We don't reuse wrappers so that the number of wrappers is equal to the number of on()s for that callback, and we can safely pop one with each call to off().