#564

Added a `.centroid()` method to ChromaticObject, which works pretty much the same as `GSObject.centroid()`, but requires a `Bandpass` object against which to integrate.  

The only open question I have is what's the right way to integrate the product of a `Bandpass` and (effectively) an `SED`, when exactly one of these maintains a `wave_list` with specific wavelengths at which the integrand should be evaluated and the other doesn't.  Here I chose the more efficient approach, though possibly less conservative, that if even one multiplier defines a `wave_list`, then integration is done via numpy.trapz instead of integ.int1d.  In contrast, note that `SED.calculateFlux()` implements the logic: numpy.trapz if `Bandpass.wave_list` is not empty, integ.int1d otherwise, which seems a little strange to me now.
>My only concern here is the repetition of the evaluateAtWavelength calls here.

Yeah, that bothered me too, I just wasn't sure what to do about it :).  The lambda function -> regular function is a good idea though, which I implemented.  For better or worse, I think the `wave_list` branch of the `centroid()` function will usually be the one that gets called, since it's difficult to represent realistic bandpasses or SEDs with analytic functions.