Require functor domains and codomains are matching in the contructor (:.:)
add Natural Transformations and make functor composition a bifunctor