code: public CompletableFuture<CopycatServer> bootstrap(Collection<Address> cluster) {
      return start(() -> cluster().bootstrap(cluster));
    }
docs: Bootstraps the cluster using the provided cluster configuration.
  <p>
  Bootstrapping the cluster results in a new cluster being formed with the provided configuration. The initial
  nodes in a cluster must always be bootstrapped. This is necessary to prevent split brain. If the provided
  configuration is empty, the local server will form a single-node cluster.
  <p>
  Only {@link Member.Type#ACTIVE} members can be included in a bootstrap configuration. If the local server is
  not initialized as an active member, it cannot be part of the bootstrap configuration for the cluster.
  <p>
  When the cluster is bootstrapped, the local server will be transitioned into the active state and begin
  participating in the Raft consensus algorithm. When the cluster is first bootstrapped, no leader will exist.
  The bootstrapped members will elect a leader amongst themselves. Once a cluster has been bootstrapped, additional
  members may be {@link #join(Address...) joined} to the cluster. In the event that the bootstrapped members cannot
  reach a quorum to elect a leader, bootstrap will continue until successful.
  <p>
  It is critical that all servers in a bootstrap configuration be started with the same exact set of members.
  Bootstrapping multiple servers with different configurations may result in split brain.
  <p>
  The {@link CompletableFuture} returned by this method will be completed once the cluster has been bootstrapped,
  a leader has been elected, and the leader has been notified of the local server's client configurations.
  
  @param cluster The bootstrap cluster configuration.
  @return A completable future to be completed once the cluster has been bootstrapped.