Speed up some Sink - cleaner version

Constant processes are special. You can skip a lot of object creation with them. We can tag a constant process with a scalaz tagged type and then build custom methods to handle that case. 

Without the optimization, this benchark takes 15-20 seconds to run, with the optimization it takes 7. We can do similar things for `zipWith`, etc.

    def benchmark {
      val p = emitRange(1,1024*1024)

      var i = 0
      def f(t: Int): Task[Unit] = { Task { i = (i + t) % 127 } }
      val fp = Process.constant(f _)

      p.to(fp).run.run
      val startTimeMap = System.currentTimeMillis
      p.to(fp).run.run
      println("End time: " + (System.currentTimeMillis - startTimeMap))
    }

To turn off the optimization, just throw away the type information:

    - val fp = Process.constant(f _)
    + val fp = Process.constant(f _): Process[Int => Task[Unit]]

Ignore the previous (now closed) pull req, that was fugly, this one actually has a clean implementation.