cut monitor entry / exits in half on "happy path" requires

Before this change RUBYGEMS_ACTIVATION_MONITOR would enter and exit
twice for every call to require.  This commit pushes the "exit" call
outside of the `ensure` block to the `rescue` and unlocks in the
appropriate place.  Eliminating the effectively "global" unlock in then
`ensure` block allows us to lock and unlock once during happy path
requires, and only lock / unlock twice when `gem_original_require` fails
and we need to attempt to activate the gem.

Here is a test to demonstrate the problem:

```
require 'rubygems'
require 'tempfile'

moncalls = []
trace = TracePoint.new(:c_call, :call) do |tp|
  if tp.method_id == :mon_enter
    moncalls << [tp.defined_class, tp.method_id, tp.path]
  end
end

f = Tempfile.open(['foo', '.rb'])
f.write "true"
f.close

$: << File.dirname(f.path)
file = File.basename f.path, '.rb'

trace.enable
require file
trace.disable

p moncalls.length
```

Before this change `moncalls.length` will return 2, after this commit,
it returns 1.
add a test to demonstrate concurrent require support
make sure to exit the monitor before raising
Merge pull request #951 from tenderlove/drop_locks

cut monitor entry / exits in half on "happy path" requires
Add GitSpecification#pretty_print
Add LockSpecification#pretty_print
Test sort order for installed source

When compared to git and vendor sources there were no tests.

Part of #944
Test vendor vs git source ordering

Part of #944
Prefer git sources over installed sources

This allows a gem from a git repository to be used instead of an
installed gem with the same version.  Without this the installed
version will be used which prevents the user from using the changes
from git which will probably be newer.

Fixes #944
Revert "backport r46145 from ruby/ruby trunk."

This reverts commit 2dde4750e9e7d2fd34a24e876fcf919fa757aa00.
backport r46684 from ruby/ruby trunk
lock around spec activation so that `gem` is threadsafe.

This program demonstrates the thread unsafetyness before this commit:

```ruby
require 'rubygems'

lp           = $LOAD_PATH.dup

10.times.map {
  Thread.new {
    gem 'minitest'
  }
}.each(&:join)

p $LOAD_PATH - lp
```

if you run this with JRuby, you will sometimes see multiple entries for
minitest on the load path.  This commit fixes the `gem` method so that
you can call `gem` in parallel and the load path is updated safely.