improve memoize with size limit

- previous implementation was dropping complete
  hash-table whenever max size was reached

- new implementation simply replaces old values
  in a fixed size hash-table when hashes collide

- use cuckoo hashing for better space usage and to
  reduce collisions of frequently used values
Does not work correctly when given args == `Value.args.init`.
```D
int _func(int x) { return 1; }
alias func = memoize!(_func, 10);
assert(func(int.init) == 1); // fail
```