Use IO exceptions instead of generic ones in IO classes

All of the lib's exceptions should be catchable without needing a generic \Exception catch clause.