It's pretty arbitrary, huh? Maybe this is another case where the right API is to take a `Func<Reference, ObjectId>` (old reference, new target) and a `Func<Reference, Reference>` (old reference, new symbolic target) instead of inferring meaning from strings. Would that be better? We'd have to do the ordering right to avoid complexity inside the callback.