### 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/test/java/org/elasticsearch/action/search/SearchResponseTests.java
shardSearchFailures,
            clusters
        );
    }
    /**
     * This test method is typically called when needing "final" Cluster objects, not intermediate CCS state.
     * So all clusters returned (whether for local only or remote cluster searches are in a final state
     * where all clusters are either successful or skipped.
     * @return Randomly chooses between a simple non-CCS Clusters object (1 cluster total with no details)
     * and a "CCS" Cluster that has multiple clusters with details (underlying Cluster objects)
     */
    static SearchResponse.Clusters randomClusters() {
        if (randomBoolean()) {
            return randomSimpleClusters();
        } else {
            return createCCSClusterObject(3, 2, true, 2, 1, 0, 0, new ShardSearchFailure[0]);
        }
    }
    /**
     * @return non-CCS Clusters - either SearchResponse.Clusters.EMPTY or a Clusters object
     * with total=1, and it is marked as either successful or skipped.
     */
    static SearchResponse.Clusters randomSimpleClusters() {
        if (randomBoolean()) {
            return SearchResponse.Clusters.EMPTY;
        } else {
            int totalClusters = 1;
            int successfulClusters = randomIntBetween(0, totalClusters);
            int skippedClusters = totalClusters - successfulClusters;
            return new SearchResponse.Clusters(totalClusters, successfulClusters, skippedClusters);