Added the Event subsystem for managing events

The Event subsystem implements the Observer design pattern for managing
Events in the application. Events are defined as changes to a model's
properties.

The EventListener object contains the action/behavior to take place when
the model changes. For example, when model data changes, you can update
Views if they need to be updated using an EventListener object.

The EventDispatcher object maintains a list of EventListener objects and
binds them to "event types." "Event types" allow you to define an
identifier for each type of Event. This way, you can use these
identifiers to bind different behavior to different Events. Using "event
types," the EventDispatcher object will invoke the appropriate
EventListener object.

When an EventListener object is invoked by EventDispatcher, an Event
object is passed as an argument (l.onEvent(event)). This Event object
contains a reference to the EventDispatcher and the type identifier of
the Event that occurred. This data can therefore be used within the
actual behavior defined in the EventListener object!

Signed-off-by: Byron Sanchez <bfs5030@gmail.com>