Implement the backend for keywords

* Keywords are uploaded as part of a new crate upload
* New keywords are automatically created
* Keywords contain a cache counter for the number of crates using a keyword
* API endpoints for listing all keywords and querying specific keywords
Cache keywords in crate rows and index them

Now the full text search should cover keywords as well.
Add some more tests for searching