Optimize key-based Hash access for empty hashes

This avoids performing the potentially expensive hash computation in
the event that the Hash is empty, as there cannot possibly be a match.
Conform to MRI behaviour for empty hashes

In the event that the `#hash` method has side effects, any optimisation
with respect to empty hashes will affect the results of the operations.

For MRI, the empty-hash optimisation seems to be applied everywhere in
2.0.0 and beyond. In 1.9.3 the #hash method is not called for #[] and
#key?, but strangely enough the performance is not improved for empty
hashes. In 1.8.7, the #hash method is always called even if empty.

This does not match the semantics of MRI exactly, as this avoids calling
the #hash method from #values_at in 1.9.3, but that would be slightly
more involved to implement.
[Truffle] Update to new source API.
Merge branch master into truffle-head.
Merge branch master into truffle-head.
Merge branch master into truffle-head.
Merge branch master into truffle-head.
[Truffle] Update to new source API.
[Truffle] Restore basic support for set_trace_func.
[Truffle] Tweaks to tracing.
[Truffle] Tweaks to set_trace_func.
Merge branch master into truffle-head.
Merge branch master into truffle-head.
[Truffle] Remove files leftover in merge.
Merge branch 'master' into truffle-head
[Truffle] Splitting option name has changed.
[Truffle] Specialised dispatch for symbols to avoid escaping problems.
[Truffle] Use a constant sized array for small hashes as we can explode the loops that operate on them.
[Truffle] Tweaks to hash for better compilation.
[Truffle] More tweaks for compilation.