'Send out this iq.
Returns a deferred that is fired when an iq response with the same id
is received. Result responses will be passed to the deferred callback.
Error responses will be transformed into a
L{StanzaError<error.StanzaError>} and result in the errback of the
deferred being invoked.
@rtype: L{defer.Deferred}'

def send(self, to=None):

    if (to is not None):
        self['to'] = to
    if (not ijabber.IIQResponseTracker.providedBy(self._xmlstream)):
        upgradeWithIQResponseTracker(self._xmlstream)
    d = defer.Deferred()
    self._xmlstream.iqDeferreds[self['id']] = d
    timeout = (self.timeout or self._xmlstream.iqDefaultTimeout)
    if (timeout is not None):
        def onTimeout():
            del self._xmlstream.iqDeferreds[self['id']]
            d.errback(TimeoutError('IQ    timed    out'))
        call = self._xmlstream._callLater(timeout, onTimeout)
        def cancelTimeout(result):
            if call.active():
                call.cancel()
            return result
        d.addBoth(cancelTimeout)
    self._xmlstream.send(self)
    return d
