Walk up the differences between the two trees and emit events to the {@code consumer}.
If the two root trees are not equal, an initial call to {@link Consumer#tree(Node,Node)}will be made where the nodes will have {@link NodeRef#ROOT the root name} (i.e. emptystring), and provided the consumer indicates to continue with the traversal, further calls to {@link Consumer#feature}, {@link Consumer#tree}, and/or {@link Consumer#bucket} will be madeas changes between the two trees are found.
At any time, if {@link Consumer#tree} or {@link Consumer#bucket} returns {@code false}, that pair of trees won't be further evaluated and the traversal continues with their siblings or parents if there are no more siblings.
Note the {@code consumer} is only notified of nodes or buckets that differ, using{@code null} of either the left of right argument to indicate there's no matching object atthe left or right side of the comparison. Left side nulls indicate a new object, right side nulls a deleted one. None of the {@code Consumer} method is ever called with equal left andright arguments.
@param consumer the callback object that gets notified of changes between the two trees andcan abort the walk for whole subtrees.