Issue 6798 - Integrate overloadings for multidimensional indexing and slicing

http://d.puremagic.com/issues/show_bug.cgi?id=6798

This patch is additional enhancement of opDollar (<a href="http://d.puremagic.com/issues/show_bug.cgi?id=3474">issue 3474</a> and #442).
Enable the mixing operator overloadings of indexing and slicing

`a[$-1, 2..$]` is translated to `a.opIndex(a.opDollar!0 - 1, a.opSlice!1(2, a.opDollar!1))`

The slicing `lwr..upr` inside bracket is converted to `a.opSlice!(dimension)(lwr, upr)`.
This enhancement never break existing codes.

<table>
<tr><th><big>expression</big></th><th><strong>newly added overloading</strong></th><th>exists overloading</tdh</tr>
<tr height=2></tr>
<tr><td>a[i0, ...]</td><td>→</td><td>a.opIndex(i0, ...)</td></tr>
<tr><td>a[]</td><td><strong>a.opIndex()</strong></td><td>a.opSlice()</td></tr>
<tr><td>a[l..u]</td><td><strong>a.opIndex(a.opSlice!0(l, u))</strong></td><td>a.opSlice(l, u)</td></tr>
<tr><td><strong>a[l..u, ...]</strong></td><td><strong>a.opIndex(a.opSlice!0(l, u), ...)</strong></td><td></td></tr>
<tr height=2></tr>
<tr><td>op a[i0, ...]</td><td>→</td><td>a.opIndexUnary!op(i0, ...)</td></tr>
<tr><td>op a[]</td><td><strong>a.opIndexUnary!op()</strong></td><td>a.opSliceUnary!op()</td></tr>
<tr><td>op a[l..u]</td><td><strong>a.opIndexUnary!op(a.opSlice!0(l, u))</strong></td><td>a.opSliceUnary!op(l, u)</td></tr>
<tr><td><strong>op a[l..u, ...]</strong></td><td><strong>a.opIndexUnary!op(a.opSlice!0(l, u), ...)</strong></td><td></td></tr>
<tr height=2></tr>
<tr><td>a[i0, ...] = v</td><td>→</td><td>a.opIndexAssign(v, i0, ...)</td></tr>
<tr><td>a[] = v</td><td><strong>a.opIndexAssign(v)</strong></td><td>a.opSliceAssign(v)</td></tr>
<tr><td>a[l..u] = v</td><td><strong>a.opIndexAssign(v, a.opSlice!0(l, u))</strong></td><td>a.opSliceAssign(v, l, u)</td></tr>
<tr><td><strong>a[l..u, ...] = v</strong></td><td><strong>a.opIndexAssign(v, a.opSlice!0(l, u), ...)</strong></td><td></td></tr>
<tr height=2></tr>
<tr><td>a[i0, ...] op= v</td><td>→</td><td>a.opIndexOpAssign!op(v, i0, ...)</td></tr>
<tr><td>a[] op= v</td><td><strong>a.opIndexOpAssign!op(v)</strong></td><td>a.opSliceOpAssign!op(v)</td></tr>
<tr><td>a[l..u] op= v</td><td><strong>a.opIndexOpAssign!op(v, a.opSlice!0(l, u))</strong></td><td>a.opSliceOpAssign!op(v, l, u)</td></tr>
<tr><td><strong>a[l..u, ...] op= v</strong></td><td><strong>a.opIndexOpAssign!op(v, a.opSlice!0(l, u), ...)<strong></td><td></td></tr>
</table>