Fix glaring problems, fix memoization, add features.

After waking up I realized that I hadn't really tested things.
This commit should make the stream actually usable in practice.

One thing that didn't totally work last night was memoization.
I wanted to be able to support the "stock scala" stream example:

  val fibs: Stream[Int] =
    0 #:: 1 #:: (fibs zip fibs.tail).map(t => t._1 + t._2)

In Scala, memoization means this is moderately efficient (but
also breaks streams for many other purposes). Even though
PspStream is not memoized by default I still wanted to be able
to support this. But due to the recursive definition, a simple
call to .memoize() would not work.

I ended up changing the Memo class' name to ~::, and adding
a ~:: method, which is like #:: but memoizes too. This means
the stock scala example (with memoization) becomes:

  val fibs: PspStream[Int] =
    0 ~:: 1 ~:: (fibs zip fibs.tail).map(t => t._1 + t._2)

As was noted before, the existing of more than two ADT nodes
for PspStream makes matching against it less attractive
(it exposes the underlying design). But I think it's a worthy
trade-off in this case.