We should use a type parameter with a context bound (e.g.
F[_]: Sync) in library code so users can choose their IO monad, but we should use a concrete IO monad in application code.
Abstracting over IO
If you're writing a library that makes use of effects, it makes sense to use the cats-effect type classes so users can choose their IO monad (IO, ZIO, Monix Task, etc).
So instead of