Many improvements to `curry` based on #147 #150 #155 #159

1. Idempotent such that `curry(curry(f))` is equivalent to `curry(f)`; see #147
2. Comparable via equality and hashable based on `func`, `args`, and `keywords`; 
3. `func`, `args`, and `keywords` attributes are readonly
  * Important because these are used to calculate the hash
4. `__name__` and `__doc__` attributes are writable
  * This allows users to customize curried objects to reflect their intended usage
5. More efficient implementation using `partial`; see #150
6. Curried objects never transmogrify into `partial` objects; see #155