Max Server Memory is actually Max Buffer Pool Memory.
From the knowledge base:
Note that the max server memory option only limits the size of the SQL Server buffer pool. The max server memory option does not limit a remaining unreserved memory area that SQL Server leaves for allocations of other components such as extended stored procedures, COM objects, non-shared DLLs, EXEs, and MAPI components. Because of the preceding allocations, it is normal for the SQL Server private bytes to exceed the max server memory configuration.
That explains why it's using 30 and change GB when I set it to 28GB. Oops. Fortunately, my sysadmin agrees with me that any resource that isn't maxed is wasted.
The optimist says the glass is half full.
The pessimist says the glass is half empty.
The engineer says the glass is twice as big as it needs to be.