Implement the simplest memoizer.

I.e., the one with where the user passes the cache lookup and insert
functions.  This version may be kind of annoying to use, since the
cache manipulation functions will probably be defined in terms of some
dictionary in the state of a state monad, meaning a bit of boiler
plate.
Delete irrelevant comment.
Add memoizer test.

This is not too bad, but the way the fib example is written it would
be inconvenient to separate the definition of fib from the monad it
runs in.  The mythical not-yet-implemented SYB-based "one cache to
rule them all" style memoizer would be more convenient ...
Add 'castMemoizer', a "one dict to rule them all"-style memoizer.

The trade off is that we gain 'Typeable' constraints on the argument
and return type of the memoized function, since we must 'cast'.
Add a 'castMemoizer' test.
Eliminate compile warnings in Memoize.hs.
Eliminate some warnings from Test.hs.

Don't really want to add a signature to
'specializedCastMemoizer' ...