code: function Query(intf, offswitch) {
    EventEmitter.call(this);
  
    // id only used for figuring out logs
    this._id = uniqueId();
    debug('Creating a new query (' + this._id + ')');
  
    this._intf = intf;
    this._offswitch = offswitch;
    this._originals = [];
    this._questions = new RecordCollection();
    this._knownAnswers = new ExpiringRecordCollection([], 'Query ' + this._id);
    this._isStopped = false;
  
    // defaults
    this._delay = misc.random(20, 120);
    this._ignoreCache = false;
    this._isContinuous = true;
    this._timeoutDelay = null;
  
    // repeated queries increasing by a factor of 2, starting at 1s apart
    this._next = ONE_SECOND;
    this._queuedPacket = null;
    this._timers = new TimerContainer(this);
  
    // stop on either the offswitch or an interface error
    intf.using(this).once('error', this.stop);
    offswitch.using(this).once('stop', this.stop);
  
    // remove expired records from known answer list
    intf.cache.using(this).on('expired', this._removeKnownAnswer);
  
    // restart query (reset delay, etc) after waking from sleep
    sleep.using(this).on('wake', this._restart);
  }
docs: Creates a new Query
  @class
  @extends EventEmitter
  
  A query asks for records on a given interface. Queries can be continuous
  or non-continuous. Continuous queries will keep asking for records until it
  gets them all. Non-continuous queries will stop after the first answer packet
  it receives, whether or not that packet has answers to its questions.
  
  @emits 'answer'
  @emits 'timeout'
  
  @param {NetworkInterface} intf - the interface the query will work on
  @param {EventEmitter}     offswitch - emitter used to shut this query down