Caching

Adds a cache layer. Doesn't do anything useful right now but this will make the LLVM plugin practical in the long run by reading optimizations from a redis cache.