Adding EqualsTester

Both of these lines seem a little over-protective to me. I don't think normal use would trigger the assert or require an unmodifiable copy (besides, if you copy, who has a reference to the copy that they could modify anyway?).

IMO, might as well keep it simple and scripty. I'd even go so far as to use a map for configuration and maybe a single function to configure and test:

```
expectEquality({
  'hello': ['hello', 'h' + 'ello'],
  'world': ["world", "wor" + "ld"],
  'three': [2, 1 + 1],
});
```

The map key can be used in failure messages. Or `expectEquality` could take a list of lists. Another way to write this is:

```
expect({
  'hello': ['hello', 'h' + 'ello'],
  'world': ["world", "wor" + "ld"],
  'three': [2, 1 + 1],
},
areEqualityGroups);
```

or something like that. This lets users compose with other matchers (maybe `not` would be useful?) and use options like reason, failureHandler and verbose.