code: def send(self,
               msg: Any, *
               rids: Iterable[int],
               signer: Signer = None,
               message_splitter=None) -> None:
          
          # 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
docs: 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