Implement nelements for various backends

Allows differentiation between `expr.count()` (will eventually ignore `NA`
values) and `expr.nelements()` (never ignores `NA` values).

Also adds an `nrows` property of symbols
Wouldn't it be the case that

```python
data = [[1, 2, 3], [1, 2, 3, 4, 5], [1]]
result = compute(s.nelements(axis=0), data)
result == 3
```
?

It looks like you're saying "compute the number of elements along the `N`th axis" is what this should say (analogous to other reductions). I think it should say "give me the number of elements on the `N`th axis". The latter makes sense for `axis == 1` whereas the former only makes sense for `axis == 0`. In other words `axis == 0` is the number of rows `axis == 1` the number of columns and so on.