Safety net for a writer whose handle is still open when it goes out of
scope or is overwritten (e.g. reassigned, or an early RETURN between
parquet_open_writer and parquet_close_writer): frees the underlying
C++ object so the process doesn't leak it. Uses abandon_parquet_writer, not
close_parquet_writer: the latter builds/writes the final table and checks that every
declared column was written and every row group finished, and throws (an uncaught C++
exception that crosses the extern "C" boundary and aborts the process) if not -- erroring,
let alone crashing, from an implicit finalizer on an incompletely-written file would be
surprising. The resulting output file is therefore not guaranteed complete/valid when
reached this way -- always prefer calling parquet_close_writer explicitly.