This PR adds a wrapper blockstore that stores blocks in memory and allows flushing to an inner blockstore. Get operations fallback to the inner store if not present in the cache. The store caps cache size preventing attacks in which a provider floods the temp store with unwanted blocks, after too many invalid blocks are sent they will be evicted.
In addition, we simplify the BlockStore trait removing Box in favor or a simple Error type.
Return unchecked blocks from all get operations to avoid rehashing.
Later on we might consider swapping the RwLocks on the TempStore for Mutexes as there shouldn't be many concurrent reads on that store. May improve performance as per this thread.