It is unclear whether or deposits should be disputable, or only
withdrawals.
At the moment, both are disputable, but that does mean we can get into
"weird" states by disputing a deposit: the held funds being negative.
In turn, this means that there is relatively little error-checking for
those balance values, the only clear thing is that withdrawing more than
is currently available is absolutely an error. But is holding more than
is available also an error? What about having a negative held funds
balance? A negative total funds? Etc...
Unfortunately, rust-csv does not support serializing maps [1], so
instead of trying to write a `Deserialize` impl, the `dump_csv` method
takes care of formatting the output as expected.
[1]: https://github.com/BurntSushi/rust-csv/issues/98
It is unfortunate that both [1] and [2] conspire to make this code way
worse than it could otherwise be with a saner (de)serialization format.
We both need to introduce `TransactionRecord` due to tagged enums not
being powerful enough in CSV, and make its `amount` field optional to
deal with the varying number of fields for each kind of transaction.
[1]: https://github.com/BurntSushi/rust-csv/issues/211
[2]: https://github.com/BurntSushi/rust-csv/issues/172