The more I work with IO[A] in Scala, the more it makes sense to me that IO needs to propagate it's failure type in the type encoding, making it IO[E, A]. I want to know which failures may happen, I don't want it hidden from me.
I think the biggest problem was that in my primary usage, I handled all my exceptions in one place anyway, so I was carefully tracking and aggregating them, only to have them all ultimately handled in the same place...