My issue was that I misunderstood the public schema as a single schema across all databases in the cluster, rather than as a schema named public created separately and by default for all new databases. When I was running GRANT ALL ON SCHEMA public as the admin user, I was doing it in the postgres database and not test_db. Thus the solution I was looking for was to run as admin:
postgres=# \c test_db;
test_db=# GRANT ALL ON SCHEMA public TO testuser;