keys that were present in both (non-recursively)
(both, only1, and only2 should be discrete partitions of all the keys
present in both dict1 and dict2)
only1 :set
keys that were present in only1 (non-recursively)
only2 :set
keys that were present in only2 (non-recursively)
differences :dict
recursive sparse dict containing information that was ‘different’ in
dict2 - either not present in dict1, or having a different value in
dict2, or removed in dict2 (in which case an instance of ‘RemovedKey’
will be set as the value in differences)
Values that are different, and both dictionaries, will themselves have
sparse entries, showing only what is different
The return value should be such that if you do if you merge the
differences with d1, you will get d2.