Gaussian Processes from Scratch