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).

For code below this line a dict with dummy value is used. Instead you could have used a set and not have to fill in dummy. Not a big deal, and no need to change it here, just figured I'd mention it.