Getting C++ API ready for a C interface

- Use C strings in public interfaces
- Use pointers in public interfaces instead of vetors or references
- Don't use smart pointers. This was overkill to begin with
the client has all the information needed to manage the object
lifetime themselves.