Add a few higher order functions

The primary purpose of this was FoldRight and FoldLeft. If desired, I can make them closer to CumProd and CumSum by storing the current cumulative value at each step (though personally I don't like that for fold).

I also added a Filter, which is similar to Find, except it just filters the list for you instead of just returning indices. This is slightly redundant, but then, Count is redundant if you do `len(Find(dst, f, s, -1))` as well.

Finally, I added ApplyTo since it was a bit odd we didn't have a way to map functions and place the result in a **different** slice.

I can remove anything we decide we don't want.

All functions have tests (except Filter because it's a simple passthrough to FilterTo), as well as examples. (One of the filter ones is pretty cool actually -- it filters the slice so that the new slice is a strictly increasing subsequence).
I've used it successfully for succinctly calculating max info gain and statistical entropy.

E.G. For entropy (pseudocode):

    f := func(a,b float64) float64 {
        // So log doesn't blow up
        if b <= 0 {
            return a
        }
        return a + b * log_2(b)
    }

    entropies := []float64{}
    for _,child := range children {
        probs = append(childEntropies, FoldLeft(f, probs, 0))
    }