Detect delegation during property assignments.

When a property assignment is executing, execution should stop once the
property is assigned. If the kernel is configured with drivers A and B,
for example, the kernel shouldn't call B if A handles the assignment.

The existing implmentation only does this correctly when a property
accepts the assignment directly or when it delegates to itself (such as
with `set: this.name = parseInt( value )`). If the assignment delegates
to another property, this isn't considered assignment, and execution on
the initiating property continues with the remaining drivers.

This causes extra work when invoking drivers lower in the stack for
properties that have already been delegated, change flags to be set on
nodes that haven't actually changed (for example n, in the case of n.p
=> m.q), and properties delegating to other propertes to be incorrectly
included in change sets (for example p in the case of n.p => n.q).

This commit detects delegation to other properties by watching for other
assignments made while executing `setProperty`. When delegation is
detected, execution completes just as it would if a driver accepted an
assignment directly.

Also, lots of tests.

Closes #1635.