Added some methods for event-handling, Renderer support and Scancode retrieval.

Note that `createWindowAndRenderer` differs slightly from the original method, because a window configuration that contains width and height gets passed in anyway and thus there's no apparent need for extra parameters.
You would use `throwIfNeg` on `createWindowAndRenderer` - at the moment we'd just trust the pointers if that call succeeded.

W.r.t. the bigger picture, you're right - exceptions *everywhere* might be a bit much. I think when we get closer to release we'll review this. Some things that one would expect to fail from user error (application user or library user) could probably be wrapped in `Either`, but things that imply deep internal state is broken would still be exceptional. For now though, I'm aiming to be as consistent as we can, which will hopefully make that job easier.