first cut at Redis refactoring

I wasn't certain how to best hide redis inside KVStore.cpp and opted for an opaque subclass, is that reasonable?

the other thing I did that may not have been a good idea was to make a global variable for the KVStore. it did not seem worth it to force clients to create this pointer and then thread it through a bunch of calls. but perhaps that's the right design? or perhaps there's a different way that I'm overlooking.

otherwise, I think this is fairly solid. the souper and souperPass clients both support static profiling. profile counts for not-optimizations are inflated by 5x and I am OK with that since optimizations and not-optimizations are incomparable things. the only thing that matters is the relative profile weight of optimizations and of not-optimizations, and those are treated correctly by this implementation.