* Note that while this is public and uses std::string, because it's a
template with specialisations in a .inl the string never crosses a
module boundary - each including module has its own implementation.
* This will be used as part of the upcoming serialisation refactor.
* Some POD structs are still given ToStr implementations as we haven't
yet switched over the serialisation system to expect all structs to
have serialise functions.
* The main motivation for this is because it's convenient to be able
to just assert a simple expression rather than print a proper error
message, but then after the fact you want to know what the value was
(e.g. a return code, or similar).