`memoize` can now accept a user key function via the `key` keyword.

Also changed default key when keywords may be present so `None` is used instead of an empty tuple for `args` or empty frozenset for `kwargs`.