Clean up the Dispose Method

This commit fixes a race condition in Dispose where we could be in the middle
of inserting an object while the Dispose executes
Prevent dispose guards from stopping the cache from flushing
Fix small race condition where you could get a null ref instead of the ObjectDisposed
Remove Dispose race condition

Added a very complex unit test that demonstrates the issue. Testing this
shit is hard.
Added EncryptedBlobCache to race condition test
fixups for GHfW submodule