Clean up value.h and mrb_value boxing

The mrb_value boxing types make value.h very complicated. There are many nested ifdefs and the struct implementation has made its way into other parts of the code causing more ifdefs there.

I split value.h into an interface and implementation. Knowledge of mrb_value structure is no longer needed outside of implementation header file. There are no longer any large ifdef blocks for boxing and less ifdefs overall. I think this will make things easier for gem and core developers alike.