[ujson] Support for serializing arbitrary types

- Previously, any arbitrary python object that wasn't a dict, int, string, etc.
  would be considered a dict/object.  The library would try to call the `toDict`
  function to find the object's dict value.  If no `toDict` function is found,
  the object will be serialized as an empty JSON object (`{}`).
- This change will add a fallback that calls a python object's `__unicode__`
  function.  If an object defines, `__unicode__` the library should probably
  serialize the object as a utf-8 string.
- Added unit tests for regular and error handling cases
- Ran guppy in tests/tests.py and confirmed there are no memory leaks