todo update
Implemented ComplexDotOp and a version of mult_and_reduce that uses it. This has sped up things quite a bit, and conv2d_fft is now faster than conv2d in some cases, especially on my laptop GPU with only 96 cores. This implies that there is room for more parallelisation.