(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
To adjust for the fact that zero has one digit, so that

* there are at most `width - log2base - 1` leading zeros
* binary_digits is at least `log2base + 1`
* `binary_digits / log2base` is never zero