Serialize operations, handle async shutdown

Note to self: commit more often. This giant commit does two main things:

1. It pipes all operations in PersistentBlobCache through KeyedOperationQueue
   so that, for example, a Invalidate + Set can't ever Invalidate last.

2. It adds a new Observable to IBlobCache called Shutdown, which signals at
   the completion of Dispose.
We have to do sync things outside the op queue since it will be shut down
Make sure tests wait until the blob cache cleans up
Merge pull request #30 from github/serialize-operations

Serialize operations to the same key, handle async shutdown
Include the key in KeyNotFoundException

KeyNotFoundException is more helpful when it includes the key. :)
Also include inner exceptions where appropriate.
Merge pull request #31 from github/keynotfound-exception-improvement

Include the key in KeyNotFoundException
Fix Sqlite3
Don't double-schedule file opens
Always close the file handles even if CopyTo fails
Only lock memoizedRequests around operations that use it
Fix another test that wasn't waiting properly
Make sure multiple calls to ShutdownQueue don't result in badness
Revert "Don't double-schedule file opens"

This reverts commit f51e9d11878d1426a092c3a9d811d0b7b3a4665b.
Misc fixups
Version bump to 2.6.0