Add a new array initialisation syntax

This syntax is:
new [length1][length2]Type(expression)
There can be any number of lengths, as long as there is at least one (as
with the current system for array creations without initialisers).

The expression can be any of the following options:
* A value which can be converted to Type, in which case every element in
  the array is set to this value.
* A function which takes no arguments and returns something which can be
  converted to Type, in which case every element in the array is set to
  a different call to this function.
* A function which takes D uint arguments (where D is the number of
  lengths specified) and returns something which can be converted to
  Type, in which case the function will be called with the indices to
  each array element as parameters, and the results will be stored in
  the new array.

Here are some examples of its use:
new [5]string("hi")
new [x][y]string("")
new [x][y][z]uint(getRandomNumber)
new [p][q][r]double(getValue)

Where the functions are something like:
uint getRandomNumber() {...}
double getValue(uint i, uint j, uint k) {...}

In the last case, i will get an index in the range 0..p-1, j will be in
0..q-1, and k will be in 0..r-1.