concept of 3d tasking

This is to share the first attempt of 3d tasking concept (see examples/mandelbrot_tasking3d/mandelbrot_tasking3d.cpp for an example).

This change doesn't generate any fails in `./run_tests.py --target=avx`

This is synthetic sugar which helps programmer to partition the problem into 1d, 2d & 3d tiles. Not sure we want it to keep it this way, but we gotta start somewhere.. here it is :) 

This a new functionality, and is accessible via the following notation:
   ` launch <<< nx, ny, nz>>> foo(..); `
or
   ` launch <<< nx, ny>>> foo(..); ` is  equivalent to    ` launch <<< nx, ny, 1>>> foo(..); `
or
   ` launch <<< nx, ny>>> foo(..); `  is equivalent to    ` launch <<< nx, 1, 1>>> foo(..); `

Old tasking method is unchanged:
   ` launch [n] foo(..); ` is  equivalent to    ` launch <<< n, 1, 1>>> foo(..); `
and also, 
   ` launch [a,b,c,...,n] foo(..); `  is  equivalent to    ` launch <<< n, 1, 1>>> foo(..); `

Inside tasks there are new variables:  `taskIndex_x`, `taskIndex_y`, `taskIndex_z` as well as `taskCount_x`, `taskCount_y`, `taskCount_z`.

`taskCount` is preserved and is equal to `taskCount_x*taskCount_y*taskCount_z`, same applies to `taskIndex` which is `taskIndex_x + taskCount_x*(taskIndex_y+ taskCount_y*taskIndex_z)`

Comments, criticism & bugs reports are welcome.