Refactor how the base channel deals with frame validation and waiting on frames
Refactor how the base channel deals with frame validation and waiting on frames

- Allow for a frame name, a frame object, a list of frame names or a list of frame objects when waiting on a frame
- Break out frame validation into its own method
- Don't block when reading from the queue but instead read while the object is in the opening, open, or closing state and check for exceptions

jonahbull/rabbitpy,gmr/rabbitpy,gmr/rabbitpy