Made SPI module allow both full and half duplex APIs

Any access to SPI from higher layers are always half duplex,
i.e. there will always be either write OR read.
The module is now more easily ported to platforms that are
using custom half duplex APIs. The previous implementation,
and currently default, is to use the ioctl() spidev.
The modification is to add HalSpiRead and HalSpiWrite that will
either call ioctl() on spidev or other platform specific APIs.