@Nonnull
    @Override
    public Promise<Void> sendMessage(@Nonnull T message, @Nonnull ConversationReplyListener<R> replyListener, long timeoutDuration, @Nonnull TimeUnit unit) {
        // register the listener
        ReplyListenerRegistration<R> listenerRegistration = new ReplyListenerRegistration<>(replyListener);
        listenerRegistration.timeoutFuture = this.replyTimeoutExecutor.schedule(listenerRegistration::timeout, timeoutDuration, unit);
        this.replyListeners.put(message.getConversationId(), listenerRegistration);

        // send the outgoing message
        return this.outgoingChannel.sendMessage(message);
    }
Passes the incoming reply to the listener, and returns true if the listener should be
unregistered

@param message the message
@return if the listener should be unregistered
helper/src/main/java/me/lucko/helper/messaging/conversation/SimpleConversationChannel.java