refactored in preparation of full user index integration

not actually accessing that index yet
refactored user index internals

exposing internal structures unnecessarily increases the surface area
implemented user index lookups and validation

* e-mail addresses are no longer hard-coded
* unknown senders and recipients are rejected (for the former the
  default is used instead)

this assumes `users.json` was downloaded via `userindex.sync`, though it
can also be created manually (see README)

note that the tests will emit WARNings unless `users.json` resides in
the `naveed` directory - another symptom of something being awry with
the testing harness