Add a mechanism to use more than one (gpu) context in a single theano function

__Disclaimer:__ This is work in progress.  Some changes made here will cause a lot of code to not work anymore, so don't use this branch unless you are prepared to deal with that.

This add some optional methods on Ops that will trigger CLinker to pass a context argument that will be available at init and runtime.  This context is typed according to the the type specified by the op.

Also this makes the context a part of the theano Type for GpuArray.  This way, most Ops will know what context they are going to work with and it makes it easy for the context to propagate through the graph.

TODO:

 - [x] Trivial example with 2 dots on different GPUs.
 - [ ] Fix crashs with tests/optimizations.
 - [ ] add a way to copy a buffer from one context to another (whithout passing thought the CPU)
 - [ ] add a way to specify the context of the inputs. (proably a tag with the context name)
 - [ ] replicate Alex models?

I will probably get rid of get_dev since it was initially used to replace the init_dev.device hack.  This has been replaced by fetching properties off the context now, so I would avoid documenting it because I don't want people to use it.

Ok on the other two.