introduces aggregate to separate functionality from colwise and by

The two previous usages of `by` where two distinct operations.
One intended usage is to apply a function to all SubDataFrames
and it is a shortcut for `map(df -> colwise(f, df), groupby(...))`.
The second usage is to create summary statistic by groups of columns,
similarly to Pandas aggregate. The second functionality was split of
into its own separate function: `aggregate`

Example usage:

using DataFrames; using RDatasets; iris = dataset("datasets", "iris");

aggregate(iris, :Species, mean)
by(iris, :Species, df -> DataFrame(
	colwise(mean, df[1:4]),
	[symbol("$(cn)_mean") for cn in names(df)[1:4]]))

aggregate(iris, :Species, [mean, var])
by(iris, :Species) do subdf
	cols = subdf[1:4]
	means = colwise(mean, cols)
	variances = colwise(var, cols)
	header = [symbol("$(cn)_$(fn)") for cn in names(cols), fn in [:mean, :var]][:]
	DataFrame([means; variances], header)
end