### Description

`SearchResponse.Clusters` currently uses a `HashMap<String, AtomicReference>` for storing Cluster objects. The AtomicReference CAS swaps are done in a do/while loop in most cases (e.g., in `CCSSingleCoordinatorSearchProgressListener`).

This can be replaced with a `ConcurrentHashMap` in conjunction with either `compute()` method or the `replace(key, assumed_previous_value, value)` method for atomically swapping in a new Cluster object with a CAS operation, assuring that the updates don't lose data from competing threads doing separate Cluster object updates.

See: https://github.com/elastic/elasticsearch/pull/98457/files#r1310467586 
server/src/main/java/org/elasticsearch/action/search/CCSSingleCoordinatorSearchProgressListener.java
int successfulCount = entry.getValue().intValue();
            AtomicReference<SearchResponse.Cluster> clusterRef = clusters.getCluster(clusterAlias);
            boolean swapped;
            do {
                SearchResponse.Cluster curr = clusterRef.get();
                SearchResponse.Cluster.Status status = curr.getStatus();
                if (status != SearchResponse.Cluster.Status.RUNNING) {
                    
                    break;
                }
                TimeValue took = new TimeValue(timeProvider.buildTookInMillis());
                int successfulShards = successfulCount + curr.getSkippedShards();
                assert successfulShards + curr.getFailedShards() == curr.getTotalShards()
                    : "successfulShards("
                        + successfulShards
                        + ") + failedShards("
                        + curr.getFailedShards()
                        + ") != totalShards ("
                        + curr.getTotalShards()
                        + ')';
                if (curr.isTimedOut() || successfulShards < curr.getTotalShards()) {
                    status = SearchResponse.Cluster.Status.PARTIAL;
                } else {
                    assert successfulShards == curr.getTotalShards()
                        : "successful (" + successfulShards + ") should equal total(" + curr.getTotalShards() + ") if get here";
                    status = SearchResponse.Cluster.Status.SUCCESSFUL;
                }
                SearchResponse.Cluster updated = new SearchResponse.Cluster.Builder(curr).setStatus(status)
                    .setSuccessfulShards(successfulShards)
                    .setTook(took)