since the cache is mutable, this k could be evicted by now, right?  I think this is more reason to have hitAndGet on mutable caches and pattern match on that result.

Also, can't this case be dropped since it is the same as the Some(cached) case after the Future(Throw(_)) | None.  Is it here for speed since the realized future is hopefully the common case?