- add `TryFrom<&str>` implementation for `MessageAge`
- allows creating `MessageAge` from string slices
- returns `Error` for invalid formats
- improve `MessageAge::new` to return a `Result`
- changes error type to `Error` enum
- add `Error::InvalidMessageAge` for specific message age errors
- mark `MessageAge::parse` and other methods as `must_use`
- use byte string literals for character matching in `parse`
- update error messages to include the invalid input value
- add `#[derive(Hash)]` to `MessageAge`