add in-memory caching using a proxy Solver class that intercepts solver requests
and, if the Souper IR has been seen before, answers with the cached result;
there tend to be a lot of hits when Souper is run as an LLVM pass since we're
called multiple times with very similar code

also some associated refactoring: Pass no longer sees CandidateMapEntries, and
the CandidateMapEntry::getQuery() method is gone with its code moved into a new
BuildQuery() function