Cache atoms to avoid redundant requests

- Once cached we really don't need to send InternAtom and AtonName requests, so
  we bypass them.
- Add atom_names property to XClient: it's basically the atoms object property
  reversed. It'll be used to cache the atom names.
- Add some tests.
- Issue #22.