Lifecycle and structural mutation for parquet_column: init, clear, deep_copy, the
unit accessors, and the four row-set operations append, append_nulls, delete_by_mask
and reindex.
Every procedure here is written once, kind-agnostically, on top of the four generated
per-kind storage helpers in parquet_columns_mutate (grow_storage, gather_storage,
append_storage, copy_storage). What is left in this file is the part that is genuinely
about the column as a whole rather than about one kind: geometry bookkeeping, the sparse
bitmap (R2), and the string kinds' delegation to parquet_string_column (DD1) — the one
storage that does not live in a Fortran array of its own.
Note the string kinds index their store by ELEMENT, not by row: a PK_STRING_VEC column of
nrows rows and width w holds nrows*w strings, with row i's vector at flat positions
(i-1)*w + 1 .. i*w (RF6). Every row-level operation below expands the row index range
accordingly before delegating.