Fixed bug in versioning of events that are stored

First, we check if the expectedVersion is greater than the stream
revision. If this is the case, then something extremely unexpected and
catastrophic has happened. Or someone screwed up big time when calling the
function. And most probably the latter.

Since we can now guarantee that the streamRevision is strictly greater
than or equal to the expected version, we check if they match. If the
expectedVersion does not match the streamRevision someone modified the
aggregate concurrently to us. Using an IConflictDetector we check if the
events that we missed conflict with the events that we generated. If there
is no conflict we can merge them by simply appending our events to the end
of the stream.

The bug was that we used the AggregateRoot version to determine the
version of the events. This is incorrect in the case that we are merging
the stream. So now we use the StreamRevision which is always correct.
Early out if no changes on the aggregate
Version bump