Write Kernel#inspect specs
Add Hash#to_a specs for taint/untrust
Fix Hash#to_a for taint/untrust
Add Hash#{to_s,inspect} specs for taint/untrust
Fix Hash#{to_s,inspect} for taint/untrust
Add Enumerable#group_by specs for taint/untrust
Fix Enumerable#group_by for taint/untrust
Add Enumerable#{to_a,entries} specs for taint/untrust
Fix Enumerable#{to_a,entries} for taint/untrust
Fix a Range#to_s spec
Add Range#to_s specs for taint/untrust
Add Range#inspect specs for taint/untrust
Add Module#extend_object specs for taint/untrust
Add Module#append_features specs for taint/untrust
Fix Module#append_features for taint/untrust
Add Module#prepend_features specs for taint/untrust
Fix Module#prepend_features for taint/untrust
Merge pull request #2536 from kachick/fix-some-infect

Some fixes for taint/untrust
Add additional safety checks to FFI Pointer handling

This makes sure we check if a pointer is NULL before dereferencing it
and also makes sure that when we free or finalize the object, we set the
internal pointer to NULL. That way we get an exception if it's used
afterwards.
Fix deadlocks in rb_thread_create

This was causing a deadlock because of two reasons. One is that we
didn't notify any joined threads when a thread created with
rb_thread_create terminated.

The second issue was that we didn't unlock the thread object and didn't
update alive status properly for the thread. Fixing this exposed another
problem. This problem happens because unlocking can cause a GC to run,
so it could GC objects put into a void* passed to the thread
initializer.

By making sure we also lock / unlock after starting the thread, we make
sure the frame calling rb_thread_create waits until the thread actually
runs. This makes sure objects with C-API handles in that frame don't get
collected and the new thread doesn't see invalid data in the void*
argument.