client: Strictly distinguish internal and public code
Disallow importing the public client
package, which is only intended
to be used by external clients. This brings multiple advantages:
- We have a clean boundary between public and internal code. This
ensures that we don't accidentally add interfaces to our public
packages that really are low-level details.
- It is easier to remain backwards compatibility as we now have two
distinct layers.
- We can perform internal refactorings more readily and iterate on
how things are handled internally without breaking the public API.
Other public packages will eventually follow to be added to the list of disallowed imports.