added peeking, new client handling via channels, fixed command bugs

I finished adding peeking. This is basically just what pop does but doesn't remove any items. I think we can probably clean this up by making a like "getEventDetails" that at least does the `HGET` for both pop/peek.

The new changes in client make things a bit cleaner. I also think this gets rid of the racey conditions with the client handling using channels.

I changed a bunch of stuff in commands that were causing bugs (ya, we need tests :/). I also made the func `queueKey` correctly use parts and changed it to not put brackets around the name of the queue.
under what conditions would queues be nil? If we can just ensure that wherever Client gets created that queues is always initialized that'd be better, makes the code easier to read.