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.