#601 - using externally-generated pupil plane images

This pull request is for new functionality that allows GalSim to use an externally-generated pupil plane image (rather than relying on keywords to specify obscuration and struts with specific configurations).

In general this is only going to work at high accuracy if the supplied images have quite high resolution.  It is difficult to make a test that would indicate whether the resolution is sufficient for all details including struts, so to some degree this is up to the user.  Because of the resolution requirements for getting the images right in detail, there are two sets of unit tests: one set with a very high res input image (which takes a long time and requires a lot of RAM, but permits quite stringent tests), and another set with a more typical resolution image, which allows somewhat less stringent tests. The former are run by calling python directly on ```test_optics.py```, while the latter are what you get when you do ```scons tests```.

I did not include a large number of options besides the basic ones of loading a pupil plane and rotating it.  I figured that once people start using this (e.g., to make WFIRST PSFs in #590) then we might get a better idea what other options would be useful.

I think it would be possible to include this in config pretty easily, using the option to pass a filename containing the image, but I did not attempt to do so.  Comments on feasibility would be welcome...

I see the concern about this algorithm failing - it would also fail if the aperture happened to be somewhat non-circular, e.g. if it was impinged by baffles on certain sides.

Another idea would be to make an arrays for the `kx`, `ky` coordinates of the rolled `pp_arr` using `utilities.kxky`, then search for the index location that maximizes `(kx**2 + ky**2)[pp_arr > 0.]`.  You should probably circumscribe the boundary of the unit disk through that point.