Before, we had this ATOM/COERCIBLE_ATOM split to solve circular
references, where COERCIBLE_ATOM was a thin wrapper around ATOM to
introduce coercions. The idea was that one might want to opt-out
entirely from the coercion system and which requires having a complete ATOM
definition without any of the extra stuff that coercions introduce. In
practice, that idea was already very leaky, with hard-coded requirements
that atoms be coercible already in place that would be hard to remove.
And besides, one can always opt out of coercions on their own types by
declaring coerce = _ => None, and on some predefined type by writing a
wrapper with such a definition.
This change flips the previous architecture so that the full ATOM
signature includes coercions and a thin BASE_ATOM module which includes a type definition,
a tag, and a way to wrap a value into an anyValue
(also, I renamed hValue to anyValue for clarity).
This should be the last substantial change to the signature of ATOM.