add actual memoization! (and more tests)