'Send a command across the wire with the given C{amp.Box}.
Mutate the given box to give it any additional keys (_command, _ask)
required for the command and request/response machinery, then send it.
If requiresAnswer is True, returns a C{Deferred} which fires when a
response is received. The C{Deferred} is fired with an C{amp.Box} on
success, or with an C{amp.RemoteAmpError} if an error is received.
If the Deferred fails and the error is not handled by the caller of
this method, the failure will be logged and the connection dropped.
@param command: a C{bytes}, the name of the command to issue.
@param box: an AmpBox with the arguments for the command.
@param requiresAnswer: a boolean.  Defaults to True.  If True, return a
Deferred which will fire when the other side responds to this command.
If False, return None and do not ask the other side for acknowledgement.
@return: a Deferred which fires the AmpBox that holds the response to
this command, or None, as specified by requiresAnswer.
@raise ProtocolSwitched: if the protocol has been switched.'

def _sendBoxCommand(self, command, box, requiresAnswer=True):

    if (self._failAllReason is not None):
        return fail(self._failAllReason)
    box[COMMAND] = command
    tag = self._nextTag()
    if requiresAnswer:
        box[ASK] = tag
    box._sendTo(self.boxSender)
    if requiresAnswer:
        result = self._outstandingRequests[tag] = Deferred()
    else:
        result = None
    return result
