docs: def _queue_task(self, args):
          ''' add transfer to waiting queue if possible
              then notify the background thread to process it '''
          if self._cancel_called:
              raise AsperaTransferQueueError("Cancel already called")
          elif self._wait_called:
              raise AsperaTransferQueueError("Cant queue items during wait")
          elif self.waiting_coordinator_count() >= self._config.max_submission_queue_size:
              raise AsperaTransferQueueError("Max queued items reached")
          else:
              _coordinator = AsperaTransferCoordinator(args)
              _components = {'meta': TransferMeta(args, transfer_id=args.transfer_id),
                             'coordinator': _coordinator}
  
              _transfer_future = AsperaTransferFuture(**_components)
              _coordinator.add_subscribers(args.subscribers, future=_transfer_future)
              _coordinator.add_done_callback(self.remove_aspera_coordinator,
                                             transfer_coordinator=_coordinator)
              self.append_waiting_queue(_coordinator)
  
              if not self._processing_thread:
                  self._processing_thread = threading.Thread(target=self._process_waiting_queue)
                  self._processing_thread.daemon = True
                  self._processing_thread.start()
  
              self._wakeup_processing_thread()
  
          return _transfer_future