One of the 2.5 specs is "make everything animatable". The implications of this didn't make it easy to just port things over, so some important redesigns were needed to enable this goal, and overcome past limitations.
Unlike the previous animation system which only allowed animation of a few predefined settings, using the data API (RNA), any property can be animated, with the changes over time stored in an F-Curve. F-Curves are encapsulated in Actions, for organisation and reuse, which can then optionally be instantiated as clips in the NLA editor.

F-Curves are the lowest level of the animation system - the keyframes, bezier handles and curve that controls the animated value of a property. F-Curves are generic and have no specific 'type', unlike their predecessors, 'Ipo Curves' (short for Interpolation).
In Blender 2.4x such Ipo Curves would be grouped in Ipos, which could be attached to data blocks such as Objects or Materials, and for some kinds of Ipos, further encapsulated in Actions, to allow re-use.
Blender 2.5 simplifies the system by making Actions the generic containers for F-Curves. Actions can contain any number of F-Curves, and can be attached to any data block.As long as the RNA data paths stored in the Action's F-Curves can be found on that data block, the animation will work. For example, an action modifying 'X location' and 'Y location' properties can be shared across multiple objects, since both objects have 'X location' and 'Y location' properties beneath them.
NLA is used for mixing and layering animation together, often for tasks like assembling a longer animation sequence from predefined actions, or for layering and refining actions on top of each other.
NLA animation data consists of several 'tracks' (like in a video editing application), which can contain 'strips' - representations of actions that can be moved in time, or layered on top of each other.
Any data block (i.e. Object, Material, Scene) can optionally have NLA data attached, and it's possible to have both NLA data and stand-alone Actions linked to the top-level data block. In this case, the NLA is evaluated first, followed by any Actions directly linked to that data block too. This is shown in the NLA editor by a non-editable 'Active Action' track, that sits above any instantiated strips.
See Animation Editors for more information on editing F-Curves, Actions, and NLA in Blender.
Drivers are used to control the animation of one property based on the value of another. Although their interface and function is similar to that of an F-curve, they sit outside Actions, alongside them in the animation system hierarchy.
Drivers are evaluated after Actions, so any F-Curve animation that may be in Actions on the data block will be overridden by the effects of a Driver.
Drivers can take their effects from single properties, differences in rotation, or scripted Python expressions which can be edited inside the UI controls.
F-Curve Modifiers are similar to their counterparts for objects - they non-destructively modify the values in the F-Curve to generate useful effects. With F-Curve Modifiers you can quickly apply randomisation or mathematical formulas, driven by the underlying shape of the curve. Just like with objects, F-Curve modifiers can be stacked for more complex results.
F-Curve Modifiers can also be applied to NLA Strips, where they will affect all of the F-Curves in the actions used by the strips.
Keying Sets are a way of specifying a set of properties that should be keyframed together, making it much easier to block out animation without forgetting to keyframe some setting or constantly being asked for the properties to keyframe.