Provide a flash partition abstraction layer and API

This provides an abstracted API to a partition.  This partition can be accessed by upper layers (a filesystems or raw read/write) without the upper layer needing any knowledge about the underlying device.

In particular, this layer hides whether the device is in internal flash or on an external flash device.

This feature will form the basis for some upcoming features in the bootloader and likely some other storage related features.