I have read that the blockchain is a series of transactions that record one person giving bitcoin to another. Please correct me if this assumption is wrong as it is the basis for my question. So, over time, doesn't it take an increasingly long time to figure out if you can accept Bitcoin from someone because you will have to go through every transaction in the history of the blockchain to validate that the person giving you Bitcoin does indeed have that Bitcoin in the first place?
With a naive implementation, yes, but in practice, no, it is not a problem.
This is because any developer that knows what they are doing is smart enough to create a database which, at the very least, records each transaction (or its position on disk) and its verification status. So when you receive a new transaction, instead of having to walk back through history, you just need to look back to the referenced previous transaction. As part of validating a transaction, you check if the previous transaction was valid. So if a transaction is marked as valid in your database, then you can be sure that the transactions that preceded it are also valid. Thus there is no need to actually look through history and re-validate those transactions.
Since it ultimately just comes down to a simple database lookup, it does not become harder to validate new transactions.
The calculation time will degenerate very slowly the longer time goes on as the mechanisms used are very efficient. Consider a simplified payment verification node (SPV) that is interested in incoming payments to an address in its wallet. The SPV node will establish a bloom filter on its connections to peers to limit the transactions received to only those containing addresses of interest. When a peer sees a transaction that matches the bloom filter, it will send the block using a merkleblock message. The merkleblock message contains the block header as well as a merkle path that links the transaction of interest to the merkle root in the block. The SPV node can use this merkle path to connect the transaction in the block and verify that the transaction is included in the block. The SPV node also uses the block header to link the block to the rest of the blockchain. The combination of these two links, between the transaction and block and between the block and the blockchain, proves that the transaction is recorded in the blockchain. All in all the SPV node will have received less than a kilobyte of data for the block header and merkle path which is very efficient and the calculation time will degenerate very slowly as more blocks are added.