(WIP) Add the `size_hint` method to Show as a default method

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!`, not only `to_string`, as implemented in this PR?

UFCS would make this addition prettier.

## Examples
```rust
format!("{}", 0u).byte_capacity() // => 1
format!("{}", 7u).byte_capacity() // => 1
format!("{}", 8u).byte_capacity() // => 2
format!("{}", 18446744073709551615u64).byte_capacity() // => 32
format!("abc{}efg", 123u).byte_capacity() // => 9
```

Fixes #16415
I think this should actually be a lower bound, or a just a loosely defined "conservative estimate" (since a true upper bound can be much larger than the real value, leading to the same overallocation problems). In this case, returning 0 by default makes sense.