### 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/TransportSearchAction.java
private static void ccsClusterInfoUpdate(
        SearchResponse searchResponse,
        AtomicReference<SearchResponse.Cluster> clusterRef,
        boolean skipUnavailable
    ) {
        /*
         * Cluster Status logic:
         * 1) FAILED if all shards failed and skip_unavailable=false
         * 2) SKIPPED if all shards failed and skip_unavailable=true
         * 3) PARTIAL if it timed out
         * 4) PARTIAL if it at least one of the shards succeeded but not all
         * 5) SUCCESSFUL if no shards failed (and did not time out)
         */
        SearchResponse.Cluster.Status status;
        if (searchResponse.getFailedShards() >= searchResponse.getTotalShards()) {
            if (skipUnavailable) {
                status = SearchResponse.Cluster.Status.SKIPPED;
            } else {
                status = SearchResponse.Cluster.Status.FAILED;
            }
        } else if (searchResponse.isTimedOut()) {
            status = SearchResponse.Cluster.Status.PARTIAL;
        } else if (searchResponse.getFailedShards() > 0) {
            status = SearchResponse.Cluster.Status.PARTIAL;
        } else {
            status = SearchResponse.Cluster.Status.SUCCESSFUL;
        }
        boolean swapped;
        do {
            SearchResponse.Cluster orig = clusterRef.get();