Rewrite a lot of stuff

The overlapping methods between Stoplight, Light, DataStore, and
DataStore::Base motivated me to find a better solution. I'm happy with
how it turned out, even though it changed a bunch of methods.

The tests cover the interface, but not the actual implementation. None
of the tests make sure that things do what they're supposed to; they
just make sure that they return what they're supposed to.

All that being said, there are still a few things I'm unsure of:

-   I forward everything from DataStore::Base onto Light. That makes it
    super convenient, but I got tired of forwarding before. I don't know
    if I like it.

-   I changed a bunch of the method names. Some of them I think are
    clear wins, like "clear_all" instead of "purge". Others are more
    questionable, like "get_attempts" instead of "attempts".