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
If we were going to make work like other reductions, wouldn't the length of the result be the same size as the maximum number of columns, not the length of the passed in axis?

```python
[[1, 2, 3],       # 3
 [1, 2, 3, 4, 5], # 5
 [1]]             # 1
#[3, 2, 2, 1, 1] (or 3)
```
?

now i don't see how `axis == 0` could return a list of length 3.