First version of a trait to abstract over backend implementations.
Currently the different backends still have a bit of specific
behaviour, but it should be possible to boil this down to a single
trait.
The primary question that is still open is how to best deal with the
interpretation of actions, as it is sort of up to the backend to
decide how to do that.
The implementation of this library is closely modeled after the core
abstraction in the Haskell library. This does not at all concern
itself with persistence, interpretation of effects and so on.