[RFC] Refactor parts of by and colwise into a new function: aggregate 

This PR separates parts of the functionality of `colwise` and `by` into a new function `aggregate`. 
So `by(iris, :Species, :sum)` is now `aggregate(iris, :Species, sum)`

- Function names are discovered through `f.env.name` removing the reliance on `eval` and allowing user defined functions 
- Anonymous functions are called λN e.g. (λ1, λ2, ...)
- `by` is operating on SubDataFrames and `aggregates` works on columns

### Original text
This PR removes the reliance on `eval` from `by(df, key, function)` and replaces it by obtaining the name of the function through introspection.

So instead of writing `by(iris, :Species, :sum)` one can now write `by(iris, :Species, sum)`. The same holds for the vector from. `by(iris, :Species, [:sum, :mean])` -> `by(iris, :Species, [sum, mean])`

TODO:
- [x] Documentation
- [x] Difference between `colwise(sum, iris)` and `colwise(iris,  sum)`
- [x] Tests
- [x] Name of anonymous functions: λ1 or x1

### Original text 2 (starting point of the discussion):
I often find myself writing code like this

````julia
using DataFrames, RDatasets
iris = dataset("datasets", "iris")

by(iris, :Species) do subdf
  means = colwise(mean, subdf[cols])
  DataFrame(means, cols)
end

# With this PR you can write it like this
by(iris, :Species) do subdf
  means = colwise(mean, subdf, cols)
  DataFrame(means, cols)
end

# I would prefer something like this, but it seems at odds with the current interface of colwise
# since it requires returning a DataFrame
by(iris, :Species) do subdf
  colwise(mean, subdf, cols)
end
````

edit: created the PR from the terminal and it removed the rest of the examples