Ruby 775 recursive locking

This pull request changes the pool manager to keep two sets of state: immutable and mutable. The mutable state is what is manipulated through the #connect code path.
The mutable state is then cloned to immutable attributes, which are attr_reader - able

The recursive locking bug was due to the pool manager taking a lock in order to connect and then eventually trying to take the same lock in order to allow some other object to read its state.