using `with CacheContext()` for memoize_with_context too so that we can support nested calls
renamed CacheContext to MemoizeContext
fixed defaults. added eaier API to use to create a new MemoizeContext instance
it's no problem entering the current MemoizeContext twice.
convert string to list instead of other way around
also create a new MemoizeContext when doing memoize_with_context