`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/test/java/org/elasticsearch/snapshots/SnapshotsInProgressSerializationTests.java
protected Writeable.Reader<Diff<Custom>> diffReader() {
        return SnapshotsInProgress::readDiffFrom;
    }
    @Override
    protected NamedWriteableRegistry getNamedWriteableRegistry() {
        return new NamedWriteableRegistry(ClusterModule.getNamedWriteables());
    }
    @Override
    protected Custom mutateInstance(Custom instance) {
        final SnapshotsInProgress snapshotsInProgress = (SnapshotsInProgress) instance;
        if (snapshotsInProgress.isEmpty()) {
            
            return snapshotsInProgress.withAddedEntry(randomSnapshot());
        } else {
            
            final String repo = randomFrom(
                snapshotsInProgress.asStream().map(SnapshotsInProgress.Entry::repository).collect(Collectors.toSet())
            );
            final List<Entry> forRepo = snapshotsInProgress.forRepo(repo);
            int index = randomIntBetween(0, forRepo.size() - 1);
            Entry entry = forRepo.get(index);
            final List<Entry> updatedEntries = new ArrayList<>(forRepo);
            updatedEntries.set(index, mutateEntry(entry));
            return snapshotsInProgress.withUpdatedEntriesForRepo(repo, updatedEntries);
        }
    }
    private Entry mutateEntry(Entry entry) {
        switch (randomInt(8)) {
            case 0 -> {
                boolean includeGlobalState = entry.includeGlobalState() == false;