Client API refactor

What this does is to pull all the connection logic between client/server handled through a single place (/lib/api), so that future changes to endpoints or paths will be much simpler to manage. This simplifies a lot the code for the different drivers, and it helps inmensely when it comes to error handling. 

Specs were updated so we're still passing 100% -- although we still need to cover some very important things, such as switching drivers or handling different configuration scenarios (updating with older client, etc).