Refactor some file writing and reading logic

- Added `adamParquetSave` method that encapsulates the most common file-writing step at the end of ADAM commands, using the existing `ParquetArgs` options as well as an `outputPath` option.
- Added a few methods for writing output inferred from `outputPath` file extensions
- A few random cleanups.

Per usual, commits are in fairly logical chunks, but I'll squash if it looks good.
I like how clean this code is. Looks good!