Working code for the new context mechanism.  Might have to rework the interface at some point.
Remove struct_id and just use the name.  It is suitably unique and shared with the rest of the methods that need to be.
New method of specifying context: get_context()

This is much cleaner than shoehorning a new argument for all nodes, we
just define an extra optional method for Ops and have a bit of utility
code in Apply.

As a bonus, this also make context passing optional and will not add
any overhead for Ops that do not use a context.
New context registery and switch things to use the new context mechanism from the last commit.
Fix struct_code test.
Pass the context to the perform method of nodes that have a context.
Sweep all the ops using the default context and change them to either
use the context of one of the inputs or take it as a parameter.
Allow None as a valid context.

The NoContext object in graph will serve a "absent context" marker.
NVCC_compiler requires to know the context we are compiling for to get the flags right.

Make all ops using NVCC_compiler have an explicit 'context' property that is used for flags determination.  This should go away if we convert them to GpuKernelBase.
Fix stupid import error.
Some other changes for NVCC_compiler
Fix typo.
Fix typing error due to confusion between the context name and the actual value.
Add script to check support for multi-gpu (and the speedup that goes with it).
Fix a bunch of fallout from the multi-gpu changes.  Now test_basic_ops passes.
Fix test_type
Fix const/non-const problem in concatenate code.
Fix most Elemwise tests and all blas tests.
Stop using init_dev.device.
Fix the supports_c_code test