redesigned i/o

This PR is mainly for code backup. Some new features are finished. Most ctor/factory methods now build objects from config objects, rather than handle objects. There are aggregates for config objects. These changes paved the way for hiding the configuration to hal user, such as uart_device (originally Uart_IO_HandleTypeDef), which is essentially a buffer and logic device. The DMA handle and UARTEx handle factory are exacted to be the msp_factory, which is also responsible for processing configurations.
Testing uart_device open method is hard. I need a clear mind and some coffee to figure it out.