There's an optional "tip" along with each transaction, so when you ask for a transaction, you specify how much the miner gets. Effectively this acts as a secondary market, since miners will choose to process the transactions in the queue with the biggest tip in each block.
This is also a factor in those times people say there was a really long time to get their transactions confirmed: if you're willing to pay a high tip, you'll be in the next available block, however, if you specify an average tip, then you're going to be bumped down the queue for a while until the transactions slow down (e.g. when its night-time at the high-volume trading hubs).
So, while there are no actual fees that are specified by any sort of centralized mechanism, the available transaction slots are effectively auctioned off. The transaction cost spiked from $6 to something in the $20+ dollar range over a couple of weeks. This was purely because of the increased media exposure due to the price spike. e.g. many holders of bitcoin might have decided to sell when it hit $15000, so that would cause more network congestion, thus causing the effective tip size that you need to pay to rise.
Remember, the creator of Bitcoin never said it was meant to be a system that was meant to scale to a global financial system. It was built merely as a "proof of concept" for the basics of a distributed currency. And as a proof of concept it works fine: it answers the question "can you make a digital currency that has no centralization, yet the network still operates?" Effectively, it's a prototype system that implements the bare-bones version of the concept. Naturally, exposing the prototype system to real-world conditions is going to teach us something about how to build a better one. So the issues with bitcoin don't necessarily reflect the potential of the blockchain technology itself. It's just one implementation.
You can tweak the numbers in the code just a little and get versions of Bitcoin that have vastly higher amounts of transaction capacity, so the current transaction capacity isn't a relevant rebuttal to the concept. However, the distributed nature of the system means that core changes are "conservative" because a majority of the hashing power (e.g. miners) needs to agree to any changes in the protocol. This is the main reason that the network doesn't scale quickly with users. Also, the miners might benefit the most, when there's a specific amount of demand for transactions relative to actual capacity. They're not going to want to massively expand capacity, if that means that the transaction fee approaches zero, because then the profit per block goes down. What will cause them to increase capacity is in fact competition from other coins, since if you have multiple ways to pay, you're going to choose the one with the lowest transaction fees. So, for this to actually right itself might need to wait for a viable rival coin to emerge. So, the optimal situation might not be "one true coin", but a mix of coins, all competing, thus each network has an incentive to keep the transaction fees down.
The two simplest ways to increase capacity are to lower the difficulty cap, or to increase the block size. Increasing the block size increases the number of transactions in a block, while lowering the difficulty means that blocks are generated faster. e.g. a 5 minute blocktime for Bitcoin would double the capacity, while decreasing the minimum time to confirm a transaction. And to do this change, you only really need to change one value in the code: target block time, and the self-regulating aspect of it takes care of the rest.
Another proposed change is one that doesn't have a set block size, but a variable size. Blocks that have more transactions in them would be considered better blocks than ones with less transactions in them. However, remember we're only talking bitcoin here. Many of these issues aren't relevant to newer coins that have modified codebases that have taken some of the problems into account. One example of a "new" coin is "bitcoin cash". What bitcoin cash is is a hard-fork of the bitcoin blockchain, and every block after the fork has a blocksize 8 times bigger than "traditional" bitcoin. Effectively, any balance someone held in Bitcoin before the fork, they also have in Bitcoin Cash, but they're now separate coins. So there's an interesting thing in that "hard forks" (a blockchain splits into two now-incompatible branches) duplicate all your currency, but in now-separate ledgers.