PIM-3371 Validate a product and its values through a validator

# Goal

Re-work the POC PR around validation https://github.com/akeneo/pim-community-dev/pull/1333 to be able to validate a product and its values by doing :

``` php
$violations = $this->container->get('pim_validator')->validate($product);
```

 - [x] re-work original PR to use interfaces for product, product value and attribute
 - [x] re-work original PR to support Class Constraint
 - [x] fix the metric validator to make it useable on product value
 - [x] fix the unique value validator (only work with form for now)
 - [x] clean up validator command

# Next step, enforce validation in product saver

Keep a dedicated service but inject this validator in product saver and add an option resolver 'validate', validate the data by default.

# Next step, refactor property path of product value violation

When validates a product and its values, the property path of a violation which concern a value doesn't allow to identify the invalid value

# Next step, refactor form validation and attribute type

Get rid of constraint guesser in AttributeType::prepareValueFormConstraints

After a first attempt it seems ok but we loose the javascript validation (APY JsFormValidation) because it's based on form constraints, could be re-worked too

| Q                    | A
| -------------------- | ---
| Bug fix?             | N
| New feature?         | Y
| BC breaks?           | N
| CI currently passes? | Y
| Tests pass?          | Y
| Scenarios pass?      | Y
| Checkstyle issues?*  | N
| PMD issues?**        | N
| Changelog updated?   | Y
| Fixed tickets        | PIM-3371
| DB schema updated?   |
| Migration script?    |
| Doc PR               |