Macro-based free monads in Rust