Who (by which mechanism) decides the size of fees?
It should be the sender (you), but with the standard client it isn't, and will probably remain like that until somebody implements a more decent way to avoid transaction spam propagation.
Until then, the client has some hardcoded fee policy that will take into account both the transaction value and the size of your transactions in bytes. Large transactions (in bytes) and small amounts tend to pay.
Who gets those fees? (I'm guessing some mining pool operator)
The miner which includes your transaction in a block.
Is there a way to NOT pay 10% when sending smallish amounts of BTC?
You don't get to choose with the standard client. And if you happen to find a client that allows you to choose, beware that standard clients won't even propagate your transaction if it doesn't abide to the hard coded fee policy. So be sure to at least try to connect directly to mining pools which don't follow the standard fee policy.