Careful abstraction of geometric shapes in a ray tracer is a key component of a clean system design, and shapes are the ideal candidate for an object-oriented approach. All geometric primitives implement a common interface, and the rest of the renderer can use this interface without needing any details about the underlying shape. This makes it possible to separate the geometric and the shading subsystem of pbrt.
Spheres are a special case of a general type of surfaces called quadrics. They are the simplest type of curved surfaces that is useful to a ray tracer and are a good starting point for general ray intersection routines.
While a natural representation would be to have a Triangle shape implementation where each triangle stored the positions of its three vertices, a more memory-efficient representation is to separately store entire triangle meshes with an array of vertex positions where each individual triangle just stores three offsets into this array for its three vertices.
The disk is an interesting quadric since it has a particularly straightforward intersection routine that avoids solving the quadric equation.
Another useful quadric is the cylinder. Cylinder shapes are centered around the z axis.