@DannyHamilton
Thanks for the wonderful response. I think it clears up much.
I understand now that when I "login" to see my wallet, what I am logging into is really a semantic that has nothing at all to do with Bitcoin. I am logging into an environment that now has access to all the private/public key pairs that "belong" to me. The pairs that involve unspent inputs are important since these contain BTC that have value and I could spend.
Whenever I want to receive BTC from some arbitrary user Bob, I do not at any point tell Bob ANYTHING about my existing public keys that I hold the private key for (where the public key is effectively a BTC address). What I do instead is generate a NEW key pair, keeping the private key stored only in this secure environment I just logged into (how this is implemented is not relevant -- could be stored in the cloud or on my local hard drive or whatever), and give Bob the BTC address corresponding to the public key from this pair. Bob makes the payment, not knowing anything about what other pairs I hold nor any unspent inputs among them.
Now, once I have received that BTC from Bob, I have another pair that I manage that has unspent inputs.
Some questions:
1. Is the above accurate?
2. Over time, won't this environment I am managing become rather unwieldy to manage? Over the course of say 80 years of a human life time for someone who is 15 years old now and using this environment, they will have a new pair for every single payment they ever receive. That could be thousands of BTC addresses they now have pairs for.
3. This bit confuses me: "As an example, any casual user of Bitcoin Core will have new addresses generated for them without their knowledge every time they send a transaction". I can see how when I want Bob to send me BTC, I generate a new key pair. But to send, how do I have a new address generated automatically? I mean sure, I could generate one, but I have to "fund" it with the unspent inputs from one of the other keypairs I own before I can make a payment from it, right? How is that anonymous? Now, there is a connection from this new keypair to the one that funded it. So the recipient may as well just receive BTC from the original keypair (ie: the original keypair may as well sign off on spending some of its unspent inputs to pay Bob).
4. In general, I get that if Alice pays Bob, Bob can create new keypairs so Alice never knows about what Bob has in his "wallet" other than all the addresses Alice paid Bob from. But whenever Bob pays Carol, he has to use previous keypairs to fund the payment to Carol, so Carol now knows through the blockchain what addresses Bob funded with. Furthermore, Alice can see where the BTC she sent Bob went on to. Am I getting this right? So basically, Bob cannot anonymize the source of his payments to Carol -- he can only anonymize his holdings from Alice who pays him.