Attempt to implement a form of caching where kernel source code that
has already been printed is not printed to a new file, instead we use
the existing filename.

I'm not entirely sure this implemented correctly because I don't
properly understand the definition of "strict weak ordering"
Use the fact the std::vector<> already has a strict weak order defined
for implementing a strict weak order over ProgramInfo instances for the
purposes of caching.