== Doing * Implement `columnar_2::save::save_document` == Cleanups * Add a `*Range` for each column type (including composite) * For each of the `*Range` types add an `encode` method. Replace the ad hoc `*Decoder::encode` methods with these methods * Get rid of `PrimVal`, do everything with `ScalarValue`. i.e. move the unknown type codes into `ScalarValue`. * Make `Change` and `Document` directly hold a `*Columns` instead of `ColumnMetadata`, construct these at parse time * Make `Chunk` an actual enum and parse the contents into that enum * Change `ChangeOpColumns::encode` to `ChangeOpColumns::splice`, include a `replace_with` range, and create a new `encode` implementation which just calls `ChangeOpColumns::empty().splice(..)` * `try_splice` on all encoders * Remove rowblock, just have structs for `ChangeOps`, `DocChangeOps`, `DocChanges` which hold their own bytes. Maybe later we add a `GenericRows` thing but we seem to not really need it * Replace every use of `usize` as a lookup with a newtype wrapper