clean ATOM/BASE_ATOM signature
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.
authored by