This will also set the final exit status to one of the failing statuses if a failure occurs. Obviously, since there can only be one final exit status, there is only one value possible if more than one spec process fails. But the main point is to exit with some error status if some spec process fails.
Also cleaned up definition of C-API macros. Absolutely no macros should have different definitions between the native code and the C-API code. Move definitions of MRI OOP bit patterns to the configure script. Added RBOOL() to convert a C++ bool to Ruby true or false.
Initially, the thought was that a CharArray could encapsulate the idea of a vector of bytes and the interpretation of those bytes relative to a particular encoding scheme. However, in practice, the interpretation of those bytes is really encapsulated in String, which composes a ByteArray and an Encoding. Pushing the logic down into CharArray required delegating almost everything from String, which is a good indicator for a poor abstraction. One example in particular illustrates this: a ByteArray (and CharArray) contain a boundary-aligned number of bytes, the boundary being a machine word. The size of a ByteArray (CharArray) is always >= to the number of bytes needed for a String's data. Encoding operations need to operate on the precise number of bytes in the String's data because those extra bytes that pad to a boundary in a ByteArray would be misinterpreted in some Encodings. Essentially, the more Encoding-aware CharArray became, the more it was just a String under String. So we removed it.
This uses a single place to configure them and uses it where needed. Prevents sprinkling all kinds of references to directories such as /opt/local everywhere. Fixes #1443