If I have a low amount and don't include a fee, the transaction takes forever to get confirmed. What happens if it never gets confirmed? Can the wallet that I sent it to still spend the money?
If a transaction goes unconfirmed for too long, it will eventually disappear from the network.
Most clients will remove it from their pool of unconfirmed transactions at some point. When most clients have removed it, you can go ahead and send the transaction again, this time with a higher fee. There's not a precise time when the transaction will disappear from the network, it could be days or up to a week. This is why it's always recommended to set a transaction fee.
The wallet that you sent it to cannot spend it because it's not confirmed. So you have to wait until it disappears from the network and send an entirely new transaction.
Your client will have this marked as spent and will prevent you from sending any unspent coins included in the transaction while continuing to try to broadcast the original transaction. There is an easy solution, though.
You simply need to dumpprivkey and add it to another client, where you can send the coins from this address to another, effectively creating a double-spend permanently nullifying the original transaction.
Instructions on how to export and import private keys can be found here: Using dumpprivkey to make a paper backup
Additionally, blockchain.info (and mtgox) allow you to import private keys which you can spend from your web wallet.
Whether a sender and recipient can rely on a transaction is a probabilistic matter, but a transaction's state is binary in regard to the current chain tip. Either, the transaction is confirmed and the money has changed hands, or it's unconfirmed and the money still belongs to the sender's wallet.
Thus, if a transaction is never confirmed, the money is still the sender's. Since this question was asked, the block space demand has increased, and most wallets have improved their tooling to deal with stuck transactions. For example Bitcoin Core added the rpc call
-abandontransaction and the startup option
-zapwallettxes. Bitcoin Core 0.14.0 added opt-in full replace-by-fee (RBF) support, which is used by default since 0.16.0. Electrum had added Opt-in RBF even earlier.
However, one thing that you need to keep in mind is that any signed transaction remains valid until at least one of its inputs is spent. When the fee levels eventually drop back to lower levels, your transaction would still get confirmed if anyone rebroadcasts it. Therefore, after abandoning a transaction, you must make sure that you spend at least one of the abandoned transaction's UTXOs to invalidate it.
Also see this related question: Why is my transaction not getting confirmed and what can I do about it?
No need to worry. I made 2 consecutive transactions (real network 'mainnet') of values 0.04BTC each. The fee for these transactions were 10 Sat/kb avg.
The transaction was never confirmed and after a week, I started to work on regtest mode, I saw those transactions were removed from blockchain and the main account has all the funds.
I do appreciate blockchain, and now I play around only with regtest well before going to mainnet.
Average transaction fee can be found here https://statoshi.info/dashboard/db/fee-estimates