old way of tensor product
whitespaces
combination slices full now, independent output kernel
grad dict is property of self
add kernel has its own gradients update
gp merge, grad dict is property of self + Y_metadata being passed through