Optimize Set#union for better performance when receiver is small Set and arg is large Set

mentioned as a suggested optimization in issue #136 .

Also added test case to verify that `Set#union` returns indeed an object of the same class as the receiver.

## Benchmarks

Before the fix:

```
  small.union(large)      136.5 (±2.2%) i/s -        689 in   5.050567s
  large.union(small)    70035.8 (±3.9%) i/s -     353404 in   5.053927s
```

After the fix:

```
  small.union(large)    84855.7 (±0.8%) i/s -     426690 in   5.028729s
  large.union(small)    90258.2 (±1.1%) i/s -     459368 in   5.090155s
```