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?

Why did you changed that from a class type to an instance? Idem for join? The change seem ok, but I don't see why this is useful.