Implement zero copy translation for move semantics and rvalue refs
The buffer ownership semantics required by the zero copy approach can be derived from C++ syntax.
If the user passes a const, they are already stating that it won't be modified, so we can use zero copy sender side semantics.
If the user passes an rvalue ref, then not only will they not modify it, the thing itself is going out of scope for them when the call is made. We can safely take over full management of that data.
The expected use case here would be a std::move called on a std::vector. We don't need to pack that into a message. Calling std::move on it means the user is expecting that vector to go out of scope and never seen again. We can create the callback to handle the cleanup when the RDMA operation is locally complete by making sure the callback keeps it in scope.
Similar logic applies to const parameters.