Let's use a custom exception -- call it "ValidationError" or something -- which stores the key/path to the invalid data, the invalid content itself, and a text explanation.  We can subclass this for Option validation, uniqueness, etc (when we get to those).