[Bug] Cat_rows evaluation fails to capture correct device
# 🐛 Bug

Evaluating `LazyTensor.cat_rows` on the gpu returns a cpu tensor.

## To reproduce

** Code snippet to reproduce **
```python
from gpytorch.kernels import MaternKernel
import torch

x = torch.randn(10, 3).cuda()
y = torch.randn(5, 3).cuda()

kernel = MaternKernel().cuda()

kxx = kernel(x)
kxy = kernel(y, x)
kyy = kernel(y)

joint_covariance = kxx.cat_rows(kxy, kyy)
joint_covariance.matmul(torch.randn(15, 3).cuda()).device # on the gpu properly
joint_covariance.evaluate().device # returns cpu
```

** Stack trace/error message **
See above. It's a missing device_id argument in the CatLazyTensor calls.

## Expected Behavior

returns on the gpu. 

## System information

**Please complete the following information:**
- gpytorch master

## Additional context
I'll put up a PR shortly. I think that this is causing the test failures in https://github.com/pytorch/botorch/pull/883

diff --git a/gpytorch/lazy/lazy_tensor.py b/gpytorch/lazy/lazy_tensor.py
index 725ba4c3..cacf7a0e 100644
--- a/gpytorch/lazy/lazy_tensor.py
+++ b/gpytorch/lazy/lazy_tensor.py
@@ -780,9 +780,9 @@ class LazyTensor(ABC):
             A = self
 
         # form matrix C = [A B; B^T D], where A = self, B = cross_mat, D = new_mat
-        upper_row = CatLazyTensor(A, B, dim=-2)
-        lower_row = CatLazyTensor(B.transpose(-1, -2), D, dim=-2)
-        new_lazy_tensor = CatLazyTensor(upper_row, lower_row, dim=-1)
+        upper_row = CatLazyTensor(A, B, dim=-2, output_device=A.device)
+        lower_row = CatLazyTensor(B.transpose(-1, -2), D, dim=-2, output_device=A.device)
+        new_lazy_tensor = CatLazyTensor(upper_row, lower_row, dim=-1, output_device=A.device)
 
         # if the old lazy tensor does not have either a root decomposition or a root inverse decomposition
         # don't create one
['gpytorch/lazy/lazy_tensor.py']