diesel_buffer_alloc simplification

Ditch useless casts and setting of memory.
Some optimizations

Track the start address and current head and tail of the unconsumed
buffer array separately. This lets us simply repoint the head when our
sentinel is satisfied and we return data to the caller. The free/malloc
that we used to do was very expensive.

This might cause increased memory use, but to help guard against that we
repoint the head and tail to the start if the buffer is ever fully
consumed. We'll probably have to do a periodic memmove though for cases
where the buffer stays ahead of consumers, perhaps when (head - start)
crosses a certain threshhold.

NB I had this code "ready" the day before but there was a subtle memory
corruption bug I had to track down.
Add the pop public method

It's called in diesel.core in a weird case.
Guard against a double __init__ call

It could happen, and it would have lead to a leak.
Try to reallocate in larger chunks

Don't just grow enough for the current data - grow either the original
size of the buffer or that size plus the size being fed into the buffer.
An attemp to be more consistent with sizes

Just use size_t. I think this is right, but I'm not 100% sure.
Check the return value of grow_internal_buffer

Fail the feed method if it fails.