Fix building in C++20 mode, improving `CsvRecord::iterator::iterator_concept` to `std::random_access_iterator_tag`; `iterator_tag` stays at `std::input_iterator_tag` because `LegacyForwardIterator` requirement and above require `reference` to be a true reference type.
Fix building in C++20 mode, improving `CsvRecord::iterator::iterator_concept`
to `std::random_access_iterator_tag`; `iterator_tag` stays at
`std::input_iterator_tag` because `LegacyForwardIterator` requirement and above
require `reference` to be a true reference type.

Since `CsvRecord::iterator::reference` is not a reference to `value_type` (which
is a pair of strings) but a pair of references, and C++20 needs to figure out a
common reference-like type which can bind to either `reference` and a reference
to `value_type` (among other combinations:
https://en.cppreference.com/w/cpp/iterator/indirectly_readable), a
specialization of `std::basic_common_reference` is needed.

This requires replacing the `std::pair` with a custom type, because `std::pair`
does not provide a conversion from a reference to a pair to a pair of
references, and because `std::basic_common_reference` specializations are
allowed only when they involve a program-defined type.

Starting from C++23 `std::pair` provides that conversion and
`std::basic_common_reference` is specialized between `std::pair` types, hence it
will be possible to use `std::pair` directly again.

See also:
https://stackoverflow.com/questions/59011331/what-is-the-purpose-of-c20-stdcommon-reference/59024241#59024241

PiperOrigin-RevId: 441377168

google/riegeli,google/riegeli,google/riegeli,google/riegeli