Refactor `dry_run`
Currently the dry_run command has some custom logic to evaluate a transaction. This sometimes leads to problems like #3358 where the logic of dry run doesn't match the one in protocol. We should try to refactor this to at least rely on the dispatch_tx function so that changes of a diverging behavior are minimized.
We could also think about mocking a one-transaction block and directly call finalize_block: this would enforce the same exact behavior even though it might slow down the simulation given the extra operations performed there. These operations though run only on new epoch so we might be able to side-step them by just mocking a block which is not the first one of a new epoch.
For reference: @Fraccaman, @yito88