(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
This can be more precise by doing `binary_digits * n / m` to give fractional estimation, e.g. decimal could have `n = 11`, `m = 3` (or, using a power-of-two divisor, say `13/4`, or `53/16`, depending on how precise we want it).