Audits are ok, but could be made simpler by implementing them as
a linked list.
Audit[source, value, previous]
AuditIterate[index] < Audit
AuditIterate tracks when a particular value in a collection is
passed on (guess it could be a key or an index for hash and array
respectively).
Previous can be an array of audits, indicating a merge.
Creating an audit trail simply means recursively traversing back
through the previous audits. Source/value trails are simply
collections of the source/values for the audit trail.
Forking is more lightweight this way; you can have many audits
with the same previous audit for no extra memory.