Add operation coalescing to the pipeline

Set up some test infrastructure too so that we can test how items get
combined without actually creating a database
Move coalescing into its own file
Group redundant operations to the same keys
Implement bulk'ifying of unrelated requests with the same operation
Change List => IEnumerable so we don't have to allocate 104034034x lists
Implement grouping unrelated selects into bulk
Merge branch 'master' into operation-coalecsing

Conflicts:
	Akavache.Sqlite3/SqlitePersistentBlobCacheNext.cs
Create some basic tests

These tests still don't verify signalling (i.e. making sure that the
input AsyncSubjects actually receive results)
Update perf graphs with preliminary results
Can't modify a dict while foreach'ing even to change the value
Rewrite dedup to actually work correctly
Signal completion to inferior subjects
Verify input subjects get signalled
Don't nest / dedup subscriptions for single-items

If we've just got a single item, we don't need to create a superior
Subject, just return the single item.

Also, fix a dumb copy-pasta bug where we dedup an Invalidate but return
an Insert
Remove the finalizer from SQLiteConnection

For this finalizer to work correctly (i.e. not blow up), it would have to be able
to guarantee that the finalizer for all of the prepared statements associated with
this connection be run *first*, which it definitely can't do. So, we should demand
explicit disposal instead.
Merge remote-tracking branch 'origin/master' into operation-coalecsing

Conflicts:
	Akavache.Sqlite3/SqlitePersistentBlobCacheNext.cs
Make sure operations whose result depend on each other don't get combined
Merge branch 'master' into operation-coalecsing
Create an OperationQueueItem class to replace tuple

Blind find-replace the tuple everywhere
Fix up the OperationQueue

Now we kind of have type-safety not really tho