What if we had:
io fn foo() {
}
in Rust, just like async fn. This would mean the function can block. Compiler could warn when it is called from async code. Initially it would be a lint, but down the line it could be switched to enforce that only io functions can call other io functions.