Per-kind "read one file column into a parquet_column" for parquet_table.
Every numeric/logical/string read passes is_valid=, which is what stops the reader from
aborting on a Null-containing column: the mask comes back here and is replayed onto the
column's own sparse validity. The temporal kinds take no mask -- their null state lives
inside each element, which the reader fills directly.