Integrating `zernike.py` and creating a new ZernikeOptic

Ideally this would not be lumped in the same branch / same pull request, but it's not sufficiently straightforward to disentangle these changes that I feel like it'd be worth the trouble.

I did a formatting pass through `optics.py`, but didn't change any functionality except to fix #14 and implement the new optic classes.

There are also a few things left to do, which I'm leaving here for my future reference:

  - [x] Docstrings for `ZernikeOptic` and `ZernikeThinLens`
  - [x] ... or maybe I should just throw out `ZernikeThinLens`, and add pupil_radius to `ThinLens`...
  - [x] Figure out where the JW-specific stuff that used to be in `zernike.py` should live in WebbPSF
  - [x] On a related note, a way to swap out the basis set for `ZernikeOptic`
  - [x] Add tests to the suite for #14 and sanity checking of the `ZernikeOptic`
  - [x] Add ZernikeOptic to `__all__`
Probably reasonable to remove them, yes.  Of course the history here is I worked out the geometry for the JWST-like 3 rings before slogging through the derivation of the fully generalized grid of hexagons coordinates. 

I'd suggest pulling out the ring 1 to 3 cases and turning that into a unit test for the _hexCenter function, since right now the test_MultiHexagonAperture function is a placeholder that almost does nothing. 

Relatedly: Alex Greenbaum (JHU grad student in our exoplanets research group, though currently on exchange in Sydney) has a Python version of the analytic formula for a PSF from a hexagonally segmented aperture, which I've just emailed her about including in some future version of WebbPSF.  That would go in misc.py along with the analytic Airy and then we could use it for a better test of the hexagon and multi hexagon apertures.