Improve Exception handling

* Add dedicated Exception class (makes it easier to `catch` separately)
* Move exception logic to Exception class (separation of concerns)
* Socket methods `selectRead()` and `selectWrite()` now report correct errors
* Faster errors checks by avoiding expensive functions calls
* More meaningful code coverage

Travis errors are caused by #4. Confirmed to work locally.