Simplify TimeParser.

To simplify the codebase a bit, TimeParser is now:

* No longer constructed with a customisable unit map; the units are mapped to multipliers by an internal `if` statement.
* No longer a template parameterised over the types involved; the output type is now fixed to an alias of `std::uint64_t`.

This pull request also contains some unit tests for checking that TimeParser handles _valid_ time-strings.  This is not a complete test suite, as it does not check exceptions.  Currently, I'm unsure how to use Catch for exception tests, so we only check the 'valid' cases.
Meh, it's fairly helpful for debugging.  Or, at least, the `s` and `m` ones are; `s` for seeking within a file, and `m` for quickly trying to get near or past the end of a file.  `ms`, `us`, and `h`, I see your point.  They're mainly there for completeness.