This is mostly for convenience, so that user code doesn't
need to add additional checks.
Also, bring the bitbangio into compatibility with busio wrt. empty
buffers.
buffer from start, end and length. The old code miscomputed length
leading to writing and reading from memory past the end of the buffer.
Consolidating the code should make it easier to get right everywhere.
This was done to allow greatly granularity when deciding what functionality
is built into each board's build. For example, this way pulseio can be
omitted to allow for something else such as touchio.