`SnapshotsInProgress` can be pretty large and today it's an `AbstractNamedDiffable` so any changes to any snapshot status result in sending the whole thing over the wire to all nodes. Yet, it undergoes a lot of small changes as snapshots proceed towards completion. We should make it properly diffable so that small changes have smaller representations on the wire and unchanged parts can be shared between instances.

Relates #77466.
server/src/main/java/org/elasticsearch/cluster/SnapshotsInProgress.java
public static final SnapshotsInProgress EMPTY = new SnapshotsInProgress(Map.of());
    public static final String TYPE = "snapshots";
    public static final String ABORTED_FAILURE_TEXT = "Snapshot was aborted by deletion";
    
    private final Map<String, List<Entry>> entries;
    public SnapshotsInProgress(StreamInput in) throws IOException {
        this(collectByRepo(in));
    }
    private static Map<String, List<Entry>> collectByRepo(StreamInput in) throws IOException {
        final int count = in.readVInt();
        if (count == 0) {
            return Map.of();
        }
        final Map<String, List<Entry>> entriesByRepo = new HashMap<>();
        for (int i = 0; i < count; i++) {
            final Entry entry = Entry.readFrom(in);
            entriesByRepo.computeIfAbsent(entry.repository(), repo -> new ArrayList<>()).add(entry);
        }
        for (Map.Entry<String, List<Entry>> entryForRepo : entriesByRepo.entrySet()) {
            entryForRepo.setValue(List.copyOf(entryForRepo.getValue()));
        }
        return entriesByRepo;
    }
    private SnapshotsInProgress(Map<String, List<Entry>> entries) {