What's the difference between geth/mist/parity?
The Ethereum protocol defines how the Ethereum network works, how clients should generally operate, and rules everyone must follow to be a valid part of the network.
This protocol is written generally such that anyone could go and implement their own version of the protocol into a custom Ethereum client.
Go-Ethereum (GETH, written in GO), Parity-Ethereum (written in Rust), and EthereumJ (written in Java) are just a few examples of different development teams building a working Ethereum client in a language of their choice.
More than simply changing the language used for development, these teams may choose to add features beyond what is specified in the Ethereum protocol. One example of this is how the different clients have developed methods to decrease the time it takes to sync a full node. GETH has "Fast Sync" and Parity-Ethereum has "Warp Sync". Since this feature was not specified in the Ethereum protocol, it is up to the development team to decide how they want to implement this feature and other features beyond the core specification.
It is also good for the network when multiple client implementations exist since humans are not perfect, and developers can make mistakes which leads to bugs. Since there are multiple different clients which make up the network, a bug in one client will not have as drastic of an effect, as errors to the network should be ignored by the other working clients.
Mist is unlike GETH and Parity-Ethereum since it is a dApp browser, not an Ethereum client. Mist interacts with a running Ethereum Client (GETH), and acts as a user interface to more easily access the APIs exposed by the JSON-RPC. Mist alone cannot do anything that useful, but when paired with a running client, can act as a simple gateway for users to interact with the Ethereum blockchain: transfer funds, create contracts, use contracts, etc...