When writing Chef recipes, it often becomes useful to abstract some common functionality into a reusable resource or library. According to its documentation, Chef seems to provide two very similar ways of doing this: Lightweight Resource Providers and Definitions.
What are the practical differences between these methods (i.e. what purpose do LWRPs serve that Definitions do not, and vice-versa), and under what conditions would I want to use one over the other? At first glance, they seem to be almost identical.