implement infer(), a Solver method that replaces isValid() for some important
use cases, such as the opt Pass and the main souper tool. infer() finds a RHS
for a Souper LHS, avoiding the need to guess what the RHS looks like. infer()
provides memory-based and Redis-based caching, and isValid() calls are no longer
cached at all. also, turn the CandidateMap data structure into a simple vector.

this patchset leaves the following changes for subsequent work:

- add an end-to-end test of the Redis subsystem

- possibly rename the CandidateMap data structure

- place the static profiling code properly (currently it is below the RAM cache,
causing it to undercount)

- possibly remove the isTriviallyValid() checker, as it does not measureably
affect performance