Currently a sync listener will block the thread that is notifying it. It should return a CompletableFuture to integrate properly with the async stack to be notified upon completion.
Also we should not invoke "alien" listeners on the same thread as they could block. We should allow listener to make itself async in some manner (ie. return type is CompletableFuture<Void>).