issue 13410 -- Performance problem with associative array byKey/byValue

Caches first non-null bucket for further lookups. Only calculates cache when byKey or byValue is requested. Based on patch from bug report by ketmar.

Fixes: https://issues.dlang.org/show_bug.cgi?id=13410
Well it says [`AssignExpression`](http://dlang.org/grammar.html#SliceExpression) and `$` should only be a rewrite.
Also I don't assign to dollary here, which apparently does _not_ work ([Issue 13574](https://issues.dlang.org/show_bug.cgi?id=13574 "incorrect code for assignment to dollar in slice expression").