Splitting into binary and lib enables using the lib in tests.
main.rs is now a thin wrapper around the lib. In the future, the exact
code split should potentialy be changed so that main.rs does all arg
parsing and then calls into the lib with fully unwrapped parameters.