Towards a new Zernike analytic optic
Linter-exposed problems cleaned up in zernike.py
PyCharm auto-format zernike.py
Rename  kwarg to  to avoid shadowing a builtin name
Create module level constants for the kinds of bases available; use those instead of magic strings
PyCharm autoformat optics.py
Created a ZernikeThinLens optic that reimplements the existing ThinLens

ZernikeThinLens includes a better pupil-radius-guessing heuristic,
as well as a pupil_radius keyword argument to make the radius at which
rho = 1 for Zernike computation explicit. Output has been checked against
the existing ThinLens and verified to be identical for the same
input parameters.
Make pylab import and lower origin explicit in demo notebook
Added zernike.py based analytic optics

  - ZernikeThinLens works like ThinLens but calls poppy.zernike.zernike
    to compute the actual OPD. Also incorporates an explicit pupil_radius
    argument (optional) and improved radius-guessing heuristic when unset
  - ZernikeOptic (may eventually move to wfe.py) takes a pupil_radius and
    coefficients as kwargs. coefficients is a sequence of (n, m, k) tuples
    where n, m are the radial and azimuthal indices of a Zernike polynomial
    and k is a coefficient in meters RMS wavefront error in that Zernike
    component
Revise warning message for pupil_radius guessing
Second pass, cleaning up PyCharm auto-formatting

  - Places where lines were broken non-optimally have been fixed
  - Applied the _guess_pupil_radius fix to ThinLens
  - Moved CompoundAnalyticOptic validation into a helper method
    for readability
Add and document pupil_radius kwarg for ThinLens
Add docstring for ZernikeOptic, add to __all__, remove ZernikeThinLens
Fix missing factor of 1 / wave.wavelength in ZernikeOptic
Added ParameterizedDistortion optic
A working ParameterizedDistortion that can be used with zernike.hexike_list
Added notebook demonstrating the different options for introducing distortions into the optical path
Add a test for issue #14 - null optical elements changing ThinLens behavior
Rework of hexikes to make API consistent with zernikes, added test suite
Remove some commented-out code