We have a struct with about 50 methods, each for an endpoint, that can be categorized because it has methods like send_messagedelete_messageedit_message, so how would you go around doing this with minimum overhead? (The methods are somewhat similar to Client in twilight_http::client - Rust)
Most of the time, when you've got lots of methods like this you'll notice they all follow a similar pattern in a fairly boring way.
If that's the case, you could use code generation to generate the methods and categories from some higher-level spec. That's what the AWS SDK and Google APIs projects do, for example.
This code generation could take the form of Rust code that literally generates the code as a string from some definition file or it could be a macro_rules! macro.
It's really up to you which approach you take, although I prefer to generate source code from a Rust function because it lets you check the generated code into version control and view it. Here is an example from another project where I generate code for some AST stuff and make sure it's in sync with syntax_kind.rs and ast.rs.
The compiler support for async fn supports holding references across await, that's why it needs all the Pin machinery (IIRC), so you shouldn't see any additional lifetime issues.
The places where lifetimes come up in async/await are generally the same places as where they come up in ordinary non-async code that uses multiple threads.