RackConnect v3.0 load balancer add/remove steps

This adds `IStep` implementations to `otter.convergence` for adding nodes to and removing them from RackConnect v3.0.

Furthermore, it generalized the optimizer step that @radix added to easily be extensible for multiple classes. Maybe one day we'll have to do multi-pass optimization; today is not that day :smile:

RCv3 supports bulk add/delete steps that allow adding or deleting any combination of nodes and servers in a single request, e.g. the following server, LB pairs can all be added and removed within a single request:

```clojure
[[:a :A]
 [:a :B]
 [:b :B]
 [:c :B]
 [:d :D]]
```

# Remaining to-do's

- [x] Bulk item tests (particularly RemovesNodeFromRCv3LoadBalancers)
- [x] Maybe to ensure that optimize only works on the steps that have been registered and doesn't mutate any other step
- [x] Check optimize works on all the registered steps at once
- [x] Rename to `BulkRCv3*`
s/node_id/server_id?