Configuration and alternate field representation for Prism TH

In order to support an alternate form of prism generation with TH
configurability has been added. This was done in the form of a PrismRules
argument that is threaded through to the parts that may need it. This
PrismRules may be passed to makePrismsWith, much the same way as LensRules is
passed about in other parts of the lens API.

This allows the addition of a different prism representation which is also
included in this patch. Ordinarily the prism for a datatype:

  data Foo = Foo Int Char Bool

Would produce:

  _Foo :: Prism' Foo (Int, Char, Bool)

This alternate representation encodes the fields as pairs ala church encoding
of lists via pairs, producing:

  _Foo :: Prism' Foo (Int, (Char, Bool))

The motivating case for this is implementing an applicative syntax on top of
prisms to unify parsing and printing, specifically between JSON and the things
these auto-generated prisms represent.