When a message is shared, share its transitive dependencies
Like other recursive operations on the dependency graph, this should not be done in a single transaction. So we'll need to find and resume any unfinished operations at startup, by looking for shared messages with unshared dependencies.