Allow concurrent require, move top-level resolution out of Kernel.

In order to protect RubyGems internals from being damaged by
concurrent requires, fcde0cd3 introduced a monitor to prevent
concurrency. However, the protected zone also included the
eventual require of the target file, using the standard require
from Kernel. This effectively forced all requires to be done in
serial when RubyGems is active.

This path moves the actual require of the target file out of the
protected zone, allowing concurrent requires without concurrent
access to RubyGems internals. It also moves this top-level
resolution logic out of kernel_require and into the Gem module.