Readability improvements in higher-order templates
Higher-order templates cover parts of https://github.com/mratsim/Arraymancer/issues/31.

However their syntax is hard to read, for example:

```Nim
proc sigmoid_cross_entropy_backward*[T](
        gradient: Tensor[T] or T,
        cached_tensor: Tensor[T],
        target: Tensor[T]
        ): Tensor[T] {.inline.} =
  let batch_size = cached_tensor.shape[^1]

  # Deal with scalar and tensor gradient
  when gradient is T:
    let grad = gradient
  elif gradient is Tensor:
    let grad = gradient.data[gradient.offset]

  return map2T(cached_tensor, target, grad * (1 / (1 + exp(-x)) - y) / T(batch_size))
```

The last part would be more readable as:
```Nim
result = map2T(cached_tensor, target):
  grad * (1 / (1 + exp(-x)) - y) / T(batch_size)
```