[query] Full support for manipulating multivalue properties

Adds support for updating multivalue properties with the UPDATE query:

<strike>UPDATE: This PR now includes support for evaluating functions as values over the previous syntax for updating multivalues properties. Currently only array functions are implemented.</strike>

UPDATE: This PR now uses functions exclusively for setting and manipulating array valyes.

The functions are based on the Postgres array functions.

````
array_remove($fieldSpec, 'ValueToRemove') // remove by value
array_replace($fieldSpec, 'ValueToReplace', 'Replacement'); // replace by valyue
array_append($fieldSpec, 'ValueToAppend); // append value
````

Other functions:

````
array('asdf', 'asdf', 'asdf') // returns an array value (i.e. `SET a.tags = array('foo', 'bar')`)
array_set($fieldSpec, 3, 'foo') // set index 3 to "foo"
````

````sql
UPDATE [nt:unstructured] AS a SET a.tags = array_replace(a.tags, 'Trains', 'Rockets') WHERE a.tags = 'Trains'
UPDATE [nt:unstructured] AS a SET a.tags = array('Rockets', 'Dragons') WHERE a.tags = 'Trains'
UPDATE [nt:unstructured] SET tags = array_replace(tags, 'Planes', 'Rockets') WHERE tags = 'Planes'
UPDATE [nt:unstructured] AS a SET a.tags = array_remove(a.tags, 'Planes') WHERE a.tags = 'Planes'
UPDATE [nt:unstructured] AS a SET a.tags = array_set(a.tags, 0, NULL) WHERE a.tags = 'Planes'
UPDATE [nt:unstructured] AS a SET a.tags = array_append(a.tags, 'Kite') WHERE a.tags = 'Planes'
UPDATE [nt:unstructured] AS a SET a.tags = array_set(a.tags, 1, 'Kite'), a.tags = array_set(a.tags, 2, 'foobar') WHERE a.tags = 'Planes'
````

See also documentation: https://github.com/phpcr/phpcr-docs/pull/17
you could also use array_replace in both cases, and if its an int its the index, if its a string its the value to replace. hm, sounds really confusing though when you accidentally pass a number as string...