code: public CompletableFuture<Void> shutdown() {
      if (!started)
        return Futures.exceptionalFuture(new IllegalStateException("context not open"));
  
      CompletableFuture<Void> future = new CompletableFuture<>();
      context.getThreadContext().executor().execute(() -> {
        started = false;
        if (clientServer != null) {
          clientServer.close().whenCompleteAsync((clientResult, clientError) -> {
            internalServer.close().whenCompleteAsync((internalResult, internalError) -> {
              if (internalError != null) {
                future.completeExceptionally(internalError);
              } else if (clientError != null) {
                future.completeExceptionally(clientError);
              } else {
                future.complete(null);
              }
            }, context.getThreadContext().executor());
          }, context.getThreadContext().executor());
        } else {
          internalServer.close().whenCompleteAsync((internalResult, internalError) -> {
            if (internalError != null) {
              future.completeExceptionally(internalError);
            } else {
              future.complete(null);
            }
          }, context.getThreadContext().executor());
        }
  
        context.transition(CopycatServer.State.INACTIVE);
      });
  
      return future.whenCompleteAsync((result, error) -> {
        if (clientTransport != serverTransport) {
          clientTransport.close();
        }
        serverTransport.close();
        context.close();
        started = false;
      });
    }
docs: Shuts down the server without leaving the Copycat cluster.
  <p>
  When the server is shutdown, the underlying {@link Transport} will be {@link Transport#close() closed}.
  
  @return A completable future to be completed once the server has been shutdown.