ID can also be an object that implements __toString

Here is my use case:

```php
    /**
     * @test
     */
    public function it_should_suspend()
    {
        $userId = UserId::generate();

        $this->scenario
            ->given([UserWasRegistered::with($userId, new Person)], $userId)
            ->when(SuspendUser::with($userId))
            ->then([
                UserWasSuspended::with($userId),
            ]);
    }
```

This is loosely related to #18 in that I ran into both of these problems more or less at the same time. Since my ID is an object I was going to have to do a lot of `(string) $id` in a lot of weird places and it was becoming unmanageable.

The issues were mainly around the fact that the `InMemoryEventStore` were using `$id` raw and assuming it was a stringish looking thing. I made changes to `DBALEventStore` to keep it consistent.

There should be a test to make sure this functionality continues to work but I wanted to make sure I'm on the right track here first. All of my domain models have an actual value object to represent their ID so this is going to be a big deal for me to have to change if I cannot pass the ID as-is in many places.
This could be a good idea if @asm89 doesn't decide we should drop the guard altogether. Thanks for the idea.

We'd have to figure out a good name for it and where to place it. Might only need to live in this namespace but it might be a larger question to answer.

I'd almost rather not do this now and get this merged first and then refactor after it is merged as it won't change anything but might draw this PR out longer from getting merged.