Change callbacks to Receivers

Instead of passing a callback function, use Receiver objects. The
"producer" gets a unique pointer to the Receiver and moves it to its
internal structures. The Receiver is then returned and moved out of the
producer in method `.finish`, which consumes the producer.
Add Adler32 checksum checking