Simplify and unify termination behaviour of pipe, tee, wye

Fixes `killBy` - now holds `(a ++ b).kill ----> a.kill` - it didn't work when `a` was `halt`.

Working tests:

scalaz.stream.CompressSpec
scalaz.stream.CreatingStreams
scalaz.stream.HashSpec
scalaz.stream.Process1Spec
scalaz.stream.ProcessPerformanceSpec
scalaz.stream.ProcessSpec
scalaz.stream.ReadingUTF8
scalaz.stream.ResourceSafetySpec
scalaz.stream.StartHere
scalaz.stream.TeeSpec
scalaz.stream.UnsafeChunkRSpec
scalaz.stream.Utf8DecodeSpec
scalaz.stream.WritingAndLogging
scalaz.stream.WyeSpec

It seems that the other tests have a problem with non-termination. I tracked the problem to `repeatEval` and `repeatNonempty`. More precisely: killing pipe where upstream contains `repeat`.

For example these terminate
```scala
halt.repeat.kill.toList
emit(1).repeat.kill.toList
```

but these don't:

```scala
halt.repeat.pipe(process1.id[Int]).kill.toList
emit(1).repeat.pipe(process1.id[Int]).kill.toList
```

In branch `topic/process/append3-merge` these don't terminate:

```scala
halt.repeat.kill.toList
halt.repeat.pipe(process1.id[Int]).kill.toList
```