The main design goals of this mmr implementation were
1. Avoid database callbacks. As it is implemented, calling side must just smartly pre-load MMR nodes from the database (about log2(tree length) for append, twice as much for deletion).
2. Reuse as much code/logic between rust and c++ clients.
3. Close to zero memory consumption.