I am increasingly uncomfortable with the fact that depending on the base class models treat parameters in a different way. This makes the code hard to maintain and hard to understand because one needs to understand both ways. To illustrate what I mean:

for a `ParametricModel`
```
In [13]: g1=models.Gaussian1D(1,2,3)

In [14]: g1.__dict__
Out[14]: 
{'_constraints': {},
 '_eqcons': [],
 '_ineqcons': [],
 '_param_dim': 1,
 '_param_metrics': {u'amplitude': (slice(0, 1, None), ()),
  u'mean': (slice(1, 2, None), ()),
  u'stddev': (slice(2, 3, None), ())},
 '_param_total_size': 3,
 '_parameters': array([ 1.,  2.,  3.])}

```

for a model which subclasses directly `Model`
```
azp=models.Pix2Sky_AZP(1,2)

In [18]: azp.__dict__
Out[18]: 
{'_gamma': 0.034906585039886591,
 '_mu': 1.0,
 '_param_dim': 1,
 '_param_metrics': {u'gamma': (slice(1, 2, None), ()),
  u'mu': (slice(0, 1, None), ())},
 '_param_total_size': 2}
```
Non-fittable models own their parameters, while fittable models own `._parameters`.

Treating parameters in a uniform way would be much preferable but I don't think we should make all models have `._parameters` and behave like fittable models do now. 

Another reason why implementing `Parameter` as a descriptor and defining model  parameters as class variables is not good is that in this way `Parameter` can have only attributes which are the same for all instances. This makes it harder to have `Parameter.value` or `Parameter.unit` or any other attribute unless it applies to all instances. Essentially these have to be set on the model as is now done with `value`.

I think a better way would be to have a regular `Parameter` object which holds its value and any other attributes specified when the class is initialized. And have a `ParameterDescriptor` to access them.