Cache shaders.

We use a std::pair of the filenames as keys, for that we needed a
std::hash specialization (and the boost::hash_combine).