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

This method is part of the public interface of a ValueObject.
It was removed due to lacking tests. This commit adds both the method
and tests.