libtime: alter strftime to use a TmFmt

The internals of strftime were converted to use a single formatter,
instead of creating and concatenating a bunch of small strings. This
showed ~3x improvement in the benches.

Also, since the formatted time may be going straight to a Writer, TmFmt
was introduced, and is returned from all formatting methods on Tm. This
allows the saving of another string allocation. Anyone wanting a String
can just call .to_string() on the returned value.

A downside to use `fmt` is that the `fmt::Result` only allows a `WriteError` with no details, so the errors that were returned beforehand can't be returned. As a compromise, they are outputted via `debug!`, so someone can still discover the error when debugging.

[breaking-change]