Refactor Server API functions

The details of the server API are now mostly relegated to api.js, and
accessed through the API container object, improving modularity and
readability, and setting us up to derive a FakeAPI for serverless
development.
Add FakeWhisperAPI for serverless development

When included after api.js, fake_api.js inits a FakeWhisperAPI.

FakeWhisperAPI inherits the methods of API, overrides a few, and
then usurps its place as the one true API.

Single device mode successfully "registers" against FakeAPI. Sadly,
multidevice mode has a recursive loop somewhere that makes the callstack
asplode.
Fix infinite recursion in ensureStringed(Array)

To ensureStringed(thing), you must first ensureStringed(thing)...
This was causing an infintel loop in multidevice mode.