Add sorted take optimizations

closes #880

Should be good enough, I think.
My point is that you could have a method, in Grouped, which is called `bufferedTake` or something, which just has the implementation from this `else if` clause:

````scala
def bufferedTake(n: Int) = {
   implicit val mon = ...
   val pretake: ...
}
````

and that you change `take` to just have

````scala
else if(n <= 100) {
  bufferedTake(n)
} else {
````