Performance improvements - mostly in `curry`

Edit:  This PR has grown (sorry) to include various performance improvements.  At times they sacrifice clarity and in rare cases correctness (see https://github.com/mrocklin/toolz/commit/6ba6737abe93614b1c4180e39ffd04dbccf3346a) but small operations like `first`, `second`, and `curry(get)` run significantly faster in the common case.  I often use these functions inside of `map` on large datasets so this is, I think worth looking into.  

I list performance improvements in some of the commits.  I also have included benchmarks in `bench/`.  I use `nosetests` on individual files while benchmarking.

Original description follows.


In https://github.com/pytoolz/toolz/pull/52 I leveraged the `inspect` module to catch more errors in curried functions before execution.  Unfortunately when the same curried function is called many times (for example if it is mapped onto a list) then this results in very many inspect calls.  These are both expensive and needless.

A simple fix is to memoize the function that calls `inspect`.  This performs well in practice but introduces a potential memory leak.  Alternatives might include introducing some additional state into `curry` or implementing a fixed-sized dictionary for use as an LRU cache in memoize.

Edit:  I've extended this PR with a small fix to memoize.  We now ask forgiveness, not permission, when dealing with non-hashable inputs to memoized functions.  This results in a significant speed improvement for memoized functions.  

In general this PR reduces the overhead of using transformed functions.  This is significant when transforming lightweight functions like `get`.