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.
Hence why I'm considering renaming it to something that sounds more likely to be an integer type :grinning:

In an ideal world, nothing should really need to know what a `Time` is, abstractions and all that.  Obviously, as `Time` is POD, it's quite difficult to do anything with it _without_ knowing what it is, though.  At least the typedef is scoped inside a class, so it's fairly obvious where _to_ look when it appears.