Timeouterror is now raised when a future expires

Prior to this an expired future would raise a RuntimeError even though there was this handy little TimeoutError already defined. This fixes it and tests for it.