Kernels for Vector-Valued Functions: A Review