Fixes and improvements to IntObjectHashMap

- Rewrite with linear probing, no state array, compaction at cleanup
- Optimize keys() and values() to not use reflection
- Optimize hashCode() and equals() for efficient iteration
- Fixed equals() to not return true for equals(null)
- Optimize iterator to not allocate new Entry at each next()
- Added toString()
- Added some new unit tests
This is a very low-level optimization: nulls are expected to be very common (at least 50% of all slots even in a "full" map with the default load factor 0.5), so I fast-path this case before making any invocation, will be faster even if the equals call is inlined (which I don't expect to happen, in the general case it's a megamorphic call since you can put any ind of object in the map).