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 would be incorrect here, as we now use values, not keys, to know which fields are available... and for reference types 'null' has a natural "unused" meaning by default, so I think a constant AVAILABLE=null would only obfuscate things.