Kind-dispatched validity for parquet_column (RF8).
Validity is deliberately NOT uniform across kinds, and this submodule is the single place that knows the difference:
kind null state lives in any_null() answers via
int32/int64/f32/f64/logical the column's own bitmap bitmap scan (O(blocks))
and their *_VEC forms one bit per ELEMENT (nrows*width bits)
string (+ PK_STRING_VEC) the embedded string column its own null_count() > 0
date/time/timestamp (+ _VEC) inside each element cached flag, rescanned when dirty
list/map/struct (reserved) the container column delegated (not yet implemented)
Hoisting everything into the column bitmap was rejected: it would mean two sources of truth
kept in sync by every mutation path, and for the temporal kinds it would fight
parquet_temporal's deliberate decision that those three types carry their own null state.
The bitmap is sparse (R2): a null-free column allocates nothing at all. It appears on the
first set_null/append_nulls and is dropped again by a whole-column set_all or an
explicit compact_validity.