code: public CompletableFuture<Void> close() {
      CompletableFuture<Void> future = new CompletableFuture<>();
      submitter.close()
        .thenCompose(v -> listener.close())
        .thenCompose(v -> manager.close())
        .whenComplete((managerResult, managerError) -> {
          connection.close().whenComplete((connectionResult, connectionError) -> {
            if (managerError != null) {
              future.completeExceptionally(managerError);
            } else if (connectionError != null) {
              future.completeExceptionally(connectionError);
            } else {
              future.complete(null);
            }
          });
        });
      return future;
    }
docs: Closes the session.
  
  @return A completable future to be completed once the session is closed.