Implement memoize(fn) returning a wrapper that caches the result of fn
per argument vector. Subsequent calls with the same arguments must skip
the underlying fn and serve the cached result instead.
Requirements
[1,2] and [1,2] hit the same cache entry; [1,2] and [1,3] don't).
function is invoked at most once per unique argument vector.
The provided solve(callArgs) drives your implementation through a sequence
of calls and reports how many times the underlying expensive function ran.
Sample tests