ValidationSets can hold a combination of validation-set assertions.
It will grow code to help applying such combinations.
For now it is able to detect conflicts among them.
This converts the singleton asserts.ErrNotFound to a richer asserts.NotFoundError struct carrying Type and optionally PrimaryKey, similar to store.AssertionNotFoundError which then gets folded with this.
This means code doesn't have to worry anymore which is which or to convert between the two. And when possible there is more information around. Though Backstores can continue to return minimal information (Type but not Headers in the new error).
A helper asserts.IsNotFound is also added to cover the simple old ==/!= asserts.ErrNotFound needs.
This also fixes/adjust some error handling to usually not repeat the richer information twice.
When `snap prepare-image` is used with --extra snaps the code will
now automatically contact the store and try to derive the side info
for the extra snaps automatically.
This makes it possible to do:
```
$ snap download core
$ snap prepare-image model.assert target-dir --extra-snaps core
```
and still have a non-sideloaded core snap.
The only downside of this approach is that the "contact" information
is missing.