Member roles for data re-partitioning

First approach at defining member roles which can be used to control the responsibilities that a node has when it becomes a cluster member
You shouldn't need to do this type of thing. `enum` types are `Serializable` by nature.

That said, I think a better approach (and this applies in `JoinRequest` and anywhere else you're serializing these) would be to add a `final int id` to `MemberRole` and serialize those. It will result in a smaller payload, and it will be more resilient to changes in the enum.