framework for composing monads?