Change component.name to property: check for duplicate when namechange

If the component is a part of a model, and the name of the model is
changed, the component will check if there are any components with
the same name.
Change model.append behavior: checks for duplicate component names

If a component with the same name already exists, the name will be
add _0, _1, _2, ...
If the component has no name, it will get the same name as its
_id_name: "Gaussian", "Voigt",...
Change model.__getitiem__ behavior: check if components have same name

__getitem__ will now raise an error it finds several components with
the same name