Enqueue the given message into the outBoxes of the specified remotes
        or into the outBoxes of all the remotes if rids is None

        :param msg: the message to enqueue
        :param rids: ids of the remotes to whose outBoxes
            this message must be enqueued
        :param message_splitter: callable that splits msg on
            two smaller messages

def send(self,
             msg: Any, *
             rids: Iterable[int],
             signer: Signer = None,
             message_splitter=None) -> None:
        """
        Enqueue the given message into the outBoxes of the specified remotes
        or into the outBoxes of all the remotes if rids is None

        :param msg: the message to enqueue
        :param rids: ids of the remotes to whose outBoxes
            this message must be enqueued
        :param message_splitter: callable that splits msg on
            two smaller messages
        """
        # Signing (if required) and serializing before enqueueing otherwise
        # each call to `_enqueue` will have to sign it and `transmit` will try
        # to serialize it which is waste of resources
        message_parts, err_msg = \
            self.prepare_for_sending(msg, signer, message_splitter)

        # TODO: returning breaks contract of super class
        if err_msg is not None:
            return False, err_msg

        if rids:
            for r in rids:
                for part in message_parts:
                    self._enqueue(part, r, signer)
        else:
            for part in message_parts:
                self._enqueueIntoAllRemotes(part, signer)
        return True, None