1. Identify a few projects you'd like to implement (toy ones if you want, or applications that exist in languages you already know well; or try to implement the Advent of Code problems: https://adventofcode.com/).
2. Organize them by your perceived difficulty of implementation (Advent of Code is already kinda organized in increasing order of difficulty).
3. Do your best to implement each project, experimenting with different approaches to architecture, testing, etc.
Having experience in many other programming languages, there are honestly so many different ways to architect and implement a Rust program compared to other languages (especially if you compare to a language like Go). Also, getting the hang of composition (with or without traits), when you come from other languages, is quite challenging.
The whole async/await thing is another story entirely. I currently do full-time Rust development and, tbh, I'm not totally convinced that async/await is always better in all situations. I started toying with Rust back in 2018 and have been doing full-time dev for a few months, and I'm still continuously learning new things.
The great thing about Rust is that it gives you so many options.
The terrible thing about Rust is that it gives you so many options :-)