docs: public void executeAsync(Supplier<CompletionStage<Void>> asyncCommand) {
        execute(() -> {
           CompletionStage<Void> future = asyncCommand.get();
           // The current permit will be released automatically
           // If the future is null, don't reserve another permit
           assert future != null;
           removePermit();
           future.whenComplete(runner);
        });
     }