re-introduce `ValueObject#with` which was removed with 6ea32ed.

The `#with` method was part of the public interface and used in several of my applications. If there is no hard reason against it, I'd like to add it back.

Some implementation notes:

* It uses `attribute_set.get(self)` in the hope to also reuse not publicly accessible attributes.
* the test-case is not optimal but as I added it to the `shared_examples` it was difficult to compare the whole object. There are tests that add more attributes later on.
* I used `[Object]` as the return type as I was not sure if there is a way to describe "a new instance of the same class".