We're curious to know what factors go into block times in a private network with a limited number of validators. Is this fixed or can it be parameterized in any way? How is it related to block times in the public net?
The block times in a private network and the public network is determined by the block difficulty adjustment algorithm. This algorithm is fixed in code, and is examined in more detail in How does the Ethereum Homestead difficulty adjustment algorithm work?
You can find the source code that represents this algorithm in block_validator.go, lines 265-312. You will have to modify this algorithm/code to change the block target time.
You can set the genesis block difficulty in your private network using the init parameter, but the difficulty will eventually be adjusted according to the algorithm described above.