restructure base class to make it easy to switch to different providers
Change how we read numeric values to handle coercions to different number types