Fix #2: Establish SSH connection in a thread-safe way

Use an Event(), rather than a boolean, to determine whether or not
the remote is connected.

Protect the connection logic with a Lock().

Change-Id: Ifc5888894a90b7e3a11e21ec3f9bf69f0a7608a8
Remove redundant `exec_command` method

The `exec_command` overrides the method of the same name from the
parent class unnecessarily.

Remove it and call the parent `exec_command` method directly from the
`run_gerrit_command` method.

Change-Id: I977000a372c9b6e9143ca0e740b971a606a83146
Add __repr__ methods on event and model classes

This gives more meaningful output when doing:

  print(event)

and means it's not necessary to use str(event).

Change-Id: I3c1546ab89c481bec24fbc4445ed7f33aa05eff8
Fix #4: Keep event's raw json data in the event object

If any future versions of Gerrit add data elements that are not
encapsulated by the event class, clients will be able to access them
via the raw json data.

Change-Id: Ia689acb808f9d200f53b86c60f024e865dd12a18
Fix #3: Don't treat unhandled event types as errors

If an unknown event is received on the event stream, for example if a
new event has been added in a later version of Gerrit, do not raise
an error.  Instead, generate an "UnhandledEvent" event.

Change-Id: Ia1902bf4a54883011b7ad3e004f58a2ba8739b21