```
This improves our Span class by making it closer to the C++20 std::span
one:
- Make the size type std::size_t rather than std::ptrdiff_t (the C++20
one underwent the same change).
- Support construction of Spans directly from arrays, std::strings,
std::arrays, std::vectors, prevectors, ... (for all but arrays, this
only works for const containers to prevent surprises).
And then make use of those improvements in various call sites.
I realize the template magic used looks scary, but it's only needed to
make overload resultion make the right choices. Note that the operations
done on values are all extremely simple: no casts, explicit conversions,
or warning-silencing constructions. That should hopefully make it
simpler to review.
```
Backport of core PR18468.