Prefer `protected` over `private` for non-public attributes

- With warnings enabled, private attributes cause a warning on MRI
  (doubly important for open source libaries, which should not emit
  warnings)
- Reduces churn when adding comparison or equality methods, since you'll
  likely need to access the attributes of the other object
- Reduces churn when adding a writer, since it is impossible to call
  private writer methods.