Set operations for associative domains and arrays

This patch provides standard set operations on associative domains and arrays:
union : \+ or |
difference : \-
intersection : &
symmetric difference : ^

The op= variations are also supported for each operation.

Also provided is a 'subset' function for associative domains.

While much of this is new functionality, a significant difference this patch implements is that operations like '+' on associative arrays are no longer promoted. For example:

// before
var r = assocA + assocB; // r is a default rectangular array of A and B's values.

// after
var r = assocA + assocB; // r is an associative array composed of the indices in both A and B.

The new functionality is much more useful in the context of adding two associative arrays together.

- [ ] Passes parallel testing
If d1 or d2 are being modified at the same time, then the returned domain could be subject to a race condition. I don't think it would generate any errors, as the 'member' and 'add' functions will lock appropriately. This same issue exists in the current implementation, and I'm not sure if there's much we can do about it.