An empty is an un-rendered, geometry-less point in space represented by a 3-dimensional symbol of some sort.
There are 8 types of empties, each type differs only in its viewport symbol. The Image type is slightly special in that you can pick any image from your computer to use as its symbol.
What are empties useful for?
Answer, lots! Use an empty any time you want a modifier, object, constraint, particle system, texture, armature, driver, etc. (anything with an object selector box) to do something based on a single point in space.
Though I can't possibly think of, let alone list, every single possible use for an empty, here are a few of the more prevalent examples of uses for an empty. Hopefully by reading this you will get a feel for what they can be used for.
Parenting
Probably the most common use for an empty is to provide a common transformation origin for a group of related/connected objects by parenting them to an empty with Ctrl+P.
Controlling Modifiers
There are many, many modifiers which can use the location of another object as a reference point for their calculations. Here are a couple of the most common:
Displacement modifier:
Array modifier:
Texture mapping
By using the Object mapping coordinates in Cycles you can have the position and transformation of an empty control your texture coordinates. This is most often used to use an empty to position a decal on another object.
(Here's another example of using an empty's Object coordinates.)