### Description

When using the DiffableUtils.diff with a vanilla OpenJDK Map, instead of the legacy ImmutableOpenMap interface, we return a mutable map (generic HashMap), which isn't the expected behaviour of the API:

https://github.com/elastic/elasticsearch/blob/45c56b22f946733712ad6d92600411c0885594c5/server/src/main/java/org/elasticsearch/cluster/DiffableUtils.java#L85

We should wrap the map returned by the diff API in an unmodifiable version.
server/src/main/java/org/elasticsearch/cluster/DiffableUtils.java
ImmutableOpenMap<K, T> after,
            KeySerializer<K> keySerializer,
            ValueSerializer<K, T> valueSerializer
        ) {
            assert after != null && before != null;
            int inserts = 0;
            var upserts = new ArrayList<Map.Entry<K, T>>();
            var diffs = new ArrayList<Map.Entry<K, Diff<T>>>();
            for (Map.Entry<K, T> entry : after.entrySet()) {
                T beforeValue = before.get(entry.getKey());
                if (beforeValue == null) {
                    upserts.add(entry);
                    inserts++;
                } else if (entry.getValue().equals(beforeValue) == false) {
                    if (valueSerializer.supportsDiffableValues()) {
                        diffs.add(Map.entry(entry.getKey(), valueSerializer.diff(entry.getValue(), beforeValue)));
                    } else {
                        upserts.add(entry);
                    }
                }
            }
            int expectedDeletes = before.size() + inserts - after.size();
            var deletes = new ArrayList<K>(expectedDeletes);
            if (expectedDeletes > 0) {
                for (Map.Entry<K, T> key : before.entrySet()) {
                    if (after.containsKey(key.getKey()) == false) {
                        deletes.add(key.getKey());
                        if (--expectedDeletes == 0) {
                            break;
                        }