Plugins and flexible field types

This is based on #919, so only the commits from 0477420 on are of interest. The PR accomplishes two things.

1. Plugins can declare types for flexible fields
2. The new `types` plugin lets the user configure the types of flexible fields.

This means we can do the following.
```
$ beet config
...
types:
    rating: int
...
$ beet modify rating=5 artist:Beatles
$ beets ls rating:4..
[lists all the songs by the Beatles]
```

TODO

- [ ] Write documentation
- [ ] Use the new API in plugins. AFAIK, that’s only the echonest plugin.

Supersedes #445 and resolves #647.