Per-kind value access for parquet_column: get_at, set_at, set_all and data_ptr
over every array kind. The string kinds live in parquet_columns_string instead, because
they delegate to parquet_string_column (DD1).
Validity handling follows the RF9 rule table: writing a value CLEARS that row's null bit, so
a default set_all drops the bitmap outright (O(1), no scan); modify_nulls=.false. leaves
the null entries and the bitmap untouched. Temporal kinds carry their null state inside
the element, so they only invalidate the cached null flag.
modify_nulls=.false. skips null ELEMENTS, not whole rows. On a vector kind it writes
every element whose own bit is clear and leaves the null ones alone, rather than refusing the
whole row because one element of it is null -- matching the rule that each operation acts at
the granularity the caller named. The default (.true.) path is untouched by this and stays a
single whole-array assignment with no per-element work, so the common case costs nothing.