Refactor out gradient calculations, and move into Layers.py, so that the convolutional layer can compute differently