Prototype style

Switch to use a prototype style API so each client registration doesn't need its own timer and avoid having many timer fire metadata api requests all at once.

## Other changes

- no longer logs directly from the library, the application can log if needed
- updated tests
- `props` is now an hash mapping instead of an array