expanded valuesAreExactlyEqual() so that arrays and objects are treated equal if their properties are equal (even though the objects themselves are not)