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.
And what if we suddenly decide that timestamps'll never be over 2^32-1, and those extra 32 bits are being wasted, and thus we should change to `std::uint32_t`?  That's a fair amount of types to change.  Yes, global find and replace exists, but the principle still stands.