Rework Particle, Bond and Particle container to use uuids

This PR updates the `Particle`, `Bond` and `ParticleContainer` to support and use the uuids for the component ids.

in more detail
- Bond and Particle now use uuids.
- The ParticleContainer now uses the uuid.uuid4 method to create new uuids
- Tests have been updated to use uuids
- I also did some cleanup in the code: 
  - No need to reraise exceptions for which we do not change the type or message
  - The `Bond` and `Particle` classes use a `classmethod` to clone the contents from a related class instead of using deepcopy (similar to the pattern used in  the mesh components)
   - Do not provide specific test message when the default assert message provides more info.
   - Use the `import... from` pattern 
   - particle_ids and coordinates attributes are now tuples



particle_ids should be removed from iter_particles as I think the goal of this test to check the case where `iter_particles(particle_ids=None)`:
```
  iterated_ids = {
   for particle.id for particle in self.pc.iter_particles()}
```