Refactoring the command event system

This commit refactors how the command event system handles associating
results and exceptions with a command. Previously, when a command failed,
a request exception was caught and a command exception was thrown. The problem
with this approach was that the client would catch the CommandException and
wrap it in a RequestException which would then be caught by a service client
and wrapped again in a CommandException. This led to increasingly deep and
unnecessary exception wrapping.

Instead of throwing exceptions in the CommandEvents class, exceptions are now
added the '__exception' attribute of a command. The request event lifecycle is
then intercepted with a CanceledResponse and the request's complete event is
stopped before any other listeners can get the event.
Adding missing tests