Change `curry` to use `functools.partial`

`curry` instances always return other `curry` instance if the arguments are not fully applied; previously, they could sometimes return `functools.partial` instances.

The performance of calling `curry` instances is better than before, but still not as good as calling `partial`.  To achieve the performance of `partial`, use `curried_func.call`.

This PR addresses the idempotency issue from #147.  It does not, however, split `curry` into `class Curry/def curry` as discussed in #147 (or as indicated by the name of this branch).  I think `curry` performs just fine as a single class.