Add proper concurrency support to Singleton/Lazy bindings

Fixes #159 by using double-check locking (with volatile) to guard Singleton and Lazy bindings from concurrent access without requiring the cost of a lock once the underlying object has been created.  Also write a test for each that uses a latch to force the race condition.  

Note: The lock is on the Lazy<T> holder in the lazy case, or the SingletonBinding in the singleton case.  Since the former is injected, and the latter can be injected as a Provider<T>, there is a possibility of a deadlock if a developer locks on the injected instance and then calls get().  This is allowed since this is far less likely than the for sure likelihood that android will have additional costs of allocation.