Avoid using std::shared_ptr in WebCLDiag

Instead, the std::strings are stored as std::map values. std::map
guarantees that pointers to values will remain valid even if other items
are inserted. We need two maps because we need to invalidate the FileID
map on SourceManager changes but still need to keep the std::strings
for old source files with log messages alive.