Add the `formatter_len_hint` method to Show and use it in `to_string`

I'm trying to balance potential code bloat and precision of the upper bound.

* Can `size_hint` default to 0 instead of None?
* How costly is occasional inaccuracy of the upper bound?
* How to implement `size_hint` for floats? I've yet to think about it.
* Is `size_hint` also that useful for the general case of `format!`, as implemented in this PR, not only `to_string`?

~~UFCS would make this addition prettier.~~

## Examples
```rust
18446744073709551615u64.to_string().byte_capacity() // => 32
123u.to_string().byte_capacity() // => 3
12.34f32.to_string().byte_capacity() // => 9
"foobar".to_string().byte_capacity() // => 6
```

Fixes #16415