fixes for STM32 SPI transactions

Essentially always run both tx and rx dma until the max length of the transaction.
If outuput and input length are not the same, dummy dma transfers are used to for the remaining ones.
This ensures that if output_len < input_len the SCK is generated and zeros are sent for the remaining words.
Input dma is also run for full transaction length even if input < output. The rx dma transfer complete interrupt is used to signal the end of the transaction
Zero input/output length cases are handled by immediately using a dummy dma transfer.

Also some more refactoring and cleanup...

This closes #337 and #348.