Clean up data interface

This cleans up the abstraction a bit and adds new robot and typo implementations. We now have:

  1. Collection (which holds two sets)
  2. Set (which holds many sequences)
  3. Sequence (which holds many points)
  4. Point (holds input/output data)

Also, I implemented it such that creating a new data model is done easily by defining one callback function: `point_parser()`. This function is passed in the raw data, and it manipulates it to get the data in the correct form: 

```json
{ "input": "x", "output": "y" }
```

You can see this in both `robots.py` and `typos.py`

Topics is a special case since you not only have to manipulate the points, but you have to manipulate the sequence data. I will make adapt for that case once I get some sleep, but it will be done using by passing a callback function I imagine.
I think there is a problem with this logic, as it does not work with the topics.data. point_parser for the collection is seemingly dependent on one point being returned, and this version of parse_raw is dependent on sequences being parsed by split lines.

In topics.data you have sequences that are single lines split into pairs of input = 'first word in line' and output = 'one of the following words'.