### 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
clusterInfoMap.put(currentDetailsFieldName, new AtomicReference<>(c));
                            } else {
                                parser.skipChildren();
                            }
                        }
                    } else {
                        parser.skipChildren();
                    }
                } else {
                    parser.skipChildren();
                }
            }
            if (clusterInfoMap.isEmpty()) {
                assert running == 0 && partial == 0 && failed == 0
                    : "Non cross-cluster should have counter for running, partial and failed equal to 0";
                return new Clusters(total, successful, skipped);
            } else {
                return new Clusters(clusterInfoMap);
            }
        }
        /**
         * @return how many total clusters the search was requested to be executed on
         */
        public int getTotal() {
            return total;
        }
        /**
         * @param status the state you want to query
         * @return how many clusters are currently in a specific state
         */