https://github.com/elastic/elasticsearch/pull/97304 removes several places that might do an expensive rebuild of the cluster state via `getStateForMasterService`. There's one other call we should be able to remove, in `JoinValidationService`, but it's a little tricky since we rely on seeing the last-accepted state for the cluster UUID validation, and it's not obviously ok to expose the last-accepted state without the no-master block.

This is a fairly minor issue because we do not do this join validation during elections, only if we're the elected master, and in that case `getStateForMasterService` is cheap. But that's not guaranteed, and we should strengthen this to avoid the that expensive step whenever possible.
server/src/main/java/org/elasticsearch/cluster/coordination/JoinValidationService.java
new CleanableResponseHandler<>(
                    listener,
                    in -> TransportResponse.Empty.INSTANCE,
                    ThreadPool.Names.CLUSTER_COORDINATION,
                    bytes::decRef
                )
            );
            if (cachedBytes == null) {
                transportService.getThreadPool().schedule(new Runnable() {
                    @Override
                    public void run() {
                        execute(cacheClearer);
                    }
                    @Override
                    public String toString() {
                        return cacheClearer + " after timeout";
                    }
                }, cacheTimeout, ThreadPool.Names.CLUSTER_COORDINATION);
            }
        }
        @Override
        public String toString() {
            return "send cached join validation request to " + discoveryNode;
        }
    }
    private ReleasableBytesReference serializeClusterState(DiscoveryNode discoveryNode, TransportVersion version) {
        final var bytesStream = transportService.newNetworkBytesStream();
        var success = false;
        try {
            final var clusterState = clusterStateSupplier.get();