Regarding point 1), I tend to use globals. Just define a Flag.ml file, put your globals in there (let verbose = ref true), populate the global in your cmdline library (I use Arg but I guess Cmdliner can probably do that too) and then anywhere you need to know the value of the cmdline flag, just use !Flag.verbose
This is not Haskell, you can use imperative code when it makes your life easier.