adding event system and making the camera listen

@vinioliveira for CR

This is an initial version of the Event system.

My inspiration: http://gameprogrammingpatterns.com/event-queue.html

Currently, the camera is listening to events and there's no new thread to consume the events. All is done by the caller. I think it's acceptable for the first version of it.
I might override the camera's `*` operator to avoid this. So this will become:

``c++
glm::mat4 mvp = perspective * camera;
```