1. I have couple of approaches that I can't decide which one is better. One is just having Loading inside state sealed class and explicitly emit it when you need it, plan and simple. Other one is having a class UIState that emits encapsulates emitting loading, performing given operation and emitting result of that operation. Depends on the complexity.
I also use Arrow's Either and I go more functional approach and that makes this really easy.
2. I tried this in medium-ish app, leaning towards large, and it made things messy sometimes. Flow is for really stream of data and plain suspend is when you want one shot operation. You need to know that by just looking at the code. And that whole mixing Loading state with data would be really bad. When your repository logic gets more complex or your UseCase than you see that you made a mess. Repositories as we commonly see them in Android apps are unnecessary but let's leave that for some other discussion :D.
4. That's a bit longer discussion. Too long for comment. I will link you a post that describes that well.
5. All documentation you have in that code is unnecessary. It either states the obvious or describes what function is for, in that case you need better name not comment (documentation). Either way it's unnecessary.