Improved type inference for Simple optic construction [PR]

I must've forgotten to submit this as a pull-request.

Changes suggested in #91 are applied.
These additions seem to really add boilerplate to the code.
If one could manage to isolate all of them, it would be better.
Someone new trying to read the code would be confused why these exist. It requires a paragraph of explanation in comments.