Make autoload thread safe

The strategy here is to reuse the fact that require is already thread
safe. This means we keep the autoload around and when a constant is
defined, we add it to the autoload itself. Only the currently loading
thread will see that constant for code loading.

Other threads will still see the Autoload and try to load the file, this
blocking until the loading is done and continue afterwards.
Add a concurrent Module#autoload spec.
require 'thread' is unneccessary since 2.0 already provides Mutex

Also fixes a typo in the comments.

Fixes #2080