### 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
private JdkMapDiff(
            KeySerializer<K> keySerializer,
            ValueSerializer<K, T> valueSerializer,
            List<K> deletes,
            List<Map.Entry<K, Diff<T>>> diffs,
            List<Map.Entry<K, T>> upserts
        ) {
            super(keySerializer, valueSerializer, deletes, diffs, upserts);
        }
        private JdkMapDiff(StreamInput in, KeySerializer<K> keySerializer, ValueSerializer<K, T> valueSerializer) throws IOException {
            super(in, keySerializer, valueSerializer);
        }
        private static <K, T> JdkMapDiff<K, T> create(
            Map<K, T> before,
            Map<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 previousValue = before.get(entry.getKey());
                if (previousValue == null) {