DataFrame sorting update

**Edit: Updated 2013-11-29**

I finally took the time to update DataFrames sorting to match the changes in mainline julia.

`sort!` now looks like

```julia
# Form 1
Base.sort!(df, alg=SortingAlg, cols=(col1, col2, ...), rev=(true, false, ...), 
               lt=(lt_fn1, lt_fn2, ...), by=(by1, by2, ...))
# Form 2
Base.sort!(df, cols=(col1, order(col2, [rev=true,] [by=byfn,] [lt=lt_fn,]), ...)
```

`alg`, `by`, `lt`, and `rev` have the same meaning as in Base.  

For form 1, these values can be specified by tuple or array, one value per column being sorted (`rev=(true,false,false)`, or a single (non-tuple) value (`rev=true`).

For form 2, the ordering for a column is specified by an `order` function, using the same keywords (`order("col", rev=true)`).

These can be mixed, and the expected thing will happen, e.g., 

```julia
sort(df, rev=true, cols=("col1", order("col2", rev=false), "col3"))
```
will sort `col1` and `col3` in reverse, and `col2` forward

`sort` and `sortperm` have identical signatures; `issorted` is identical except for missing the `alg` (algorithm) keyword, which doesn't make much sense.

The main work is done by setting up a `DFPerm` `Ordering`, which specifies the correct comparison function in `lt()` for each column.  Comments are inline.

cc: @StefanKarpinski