Can I transfer to as many addresses as I'd like in a given transaction? Is there a technical upper bound? If there is an upper bound that is not technical, is there a reason why the upper bound was chosen? Is it a "consensus" limit or just a software default? If there is a limit, was there always a limit?
There is no hard coded limit to the quantity of destinations in a single transaction. However, there is an overall transaction weight limit, which is roughly half the block weight. Therefore, if you tried to pack in an unusually high quantity of inputs / outputs, you could end up with a transaction that exceeds the maximum allowed tx weight limit and thus gets rejected.
Can I transfer to as many addresses as I'd like in a given transaction?
Is there a technical upper bound?
Yes. The transaction cannot exceed its overall weight limit, which is half the penalty-free block weight.
is there a reason why the upper bound was chosen?
Presumably to prevent spam attacks.
Is it a "consensus" limit or just a software default?
It's consensus level.
If there is a limit, was there always a limit?
There has always been a limit to the maximum tx weight. Prior to HF version 8, this limit was the set to the penalty-free block weight. Since version 8, it's half the penalty-free block weight.
Since bulletproofs, there is also a maximum of 16 outputs per transaction.
The current limit for bulletproof transactions is 16 outputs per transactions. This is an arbitrary limit, not a limit inherent in the bulletproof construction. It is enforced by consensus. I don't actually remember why this limit was set (originally it was to avoid a very small transaction costing a lot of time to verify, but the weight system prevents this). Thus you are limited to 16 destination addresses per transaction.
This was not always the case. Before bulletproofs, the only limit was the block size (and by extension, maximum transaction size).