### 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/SearchResponse.java
private transient Boolean ccsMinimizeRoundtrips;
        /**
         * For use with cross-cluster searches.
         * When minimizing roundtrips, the number of successful, skipped, running, partial and failed clusters
         * is not known until the end of the search and it the information in SearchResponse.Cluster object
         * will be updated as each cluster returns.
         * @param localIndices The localIndices to be searched - null if no local indices are to be searched
         * @param remoteClusterIndices mapping of clusterAlias -> OriginalIndices for each remote cluster
         * @param ccsMinimizeRoundtrips whether minimizing roundtrips for the CCS
         * @param skipUnavailablePredicate given a cluster alias, returns true if that cluster is skip_unavailable=true
         *                                 and false otherwise
         */
        public Clusters(
            @Nullable OriginalIndices localIndices,
            Map<String, OriginalIndices> remoteClusterIndices,
            boolean ccsMinimizeRoundtrips,
            Predicate<String> skipUnavailablePredicate
        ) {
            assert remoteClusterIndices.size() > 0 : "At least one remote cluster must be passed into this Cluster constructor";
            this.total = remoteClusterIndices.size() + (localIndices == null ? 0 : 1);
            assert total >= 1 : "No local indices or remote clusters passed in";
            this.successful = 0; 
            this.skipped = 0;    
            this.ccsMinimizeRoundtrips = ccsMinimizeRoundtrips;
            Map<String, AtomicReference<Cluster>> m = new HashMap<>();
            if (localIndices != null) {
                String localKey = RemoteClusterAware.LOCAL_CLUSTER_GROUP_KEY;
                Cluster c = new Cluster(localKey, String.join(",", localIndices.indices()), false);
                m.put(localKey, new AtomicReference<>(c));