Separate the producer and consumer side of a Queue

In extending the interface of Queue to support the iterator and
"generator" interfaces, I neglected an important point.  The beauty of a
Queue is that the `get` and `put` sides are implicitly bound and can be
safely passed to a consumer and a producer separately.  To continue in
that vein, I've separated the generator and iterator interfaces such
that they can only either produce or consume, having access to either
`get` or `put` but not both.  These objects must be created by calling
`iterate` or `generate` explicitly.