Turns the element types that need a column, a packed string store or a temporal element into the
canonical key form the engine takes, and implements pf_sort_keys.
The six intrinsic types are handled one tier down, in src/parquet_argsort_kernel.f90; this file
is what parquet_sorting adds on top of them. See feature_modules.md section 4.
This file decides nothing about order. It extracts values, says which rows are null, and
passes the caller's descending/nulls_first flags through -- every ordering decision is made
in one place (sort_compare_key, src/parquet_argsort_engine.f90), which is what stops a
raw-array sort, a table sort and a read-time sort_by= from ever disagreeing.
The canonical form is deliberately narrow: an integer key, a real key, or a packed
(offsets, data) string key, each with an optional per-row validity array. Everything else
reduces to one of those three -- a logical and every temporal kind order exactly as their
stored integers do, and a parquet_timestamp becomes two integer keys rather than one.