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
> Why do you use ugly typeid.getHash instead of pretty core.internal.hash.hashOf?

Let aside the ugly/pretty argument, because it's internal to druntime and yet untested in the wild. Would be interesting to introduce it as `hashOf` in `object.di`.
Also it would be a bad choice to use TypeInfo based hashing for one overload of memoize and hashOf for the other.

> And is it planned that args order is no object?

No, this is not necessary but that is how dmd composes hashes. So it's computing the hash of a tuple without creating a temporary tuple.