Transactional Tasks and Checks for atomic actions
To be able to have atomic actions (e.g. add a set of packages to a repository), which can be reverted if it fails halfway, all of its steps (aka. Tasks) must be revertible.
We need a framework in which repod is able to work on its actions, while allowing us to retain a before and after state, to easily revert faulty Tasks. In this context Checks are supposed to help Tasks to evaluate whether they should be run at all (pre checks) or whether they were successful (post checks).