Introduce partition IDs

Partition IDs are particularly useful for user-facing code but may have value elsewhere.

* Translation functions from hash (integer or binary) to partition ID and back. Partition IDs are zero-based up to (but not including) ring
  size.
* For user-facing tools, hash_is_partition_boundary/2 can be used to verify whether a hash provided by the user is actually the first in a partition.
* EQC and unit tests.

Supersedes #632 (this is squashed and rebased to our integration branch).