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
This is going to be slow for domains with a lot of indices that *are* proper subsets or nearly so.  For such domains, you'll want a reduction, preferably with in-order tree traversal so it can short-circuit (I don't know if our && reduce does that).  It could be serialized if the size is below some threshold, but I'm not really sure how to pick that threshold.