A package is the minimal unit of installation of the system. Its main purpose is allow the user to easily install, uninstall and upgrade their system, taking care of the dependencies and initial configuration and making sure that everything is ready to work as expected.
It usually consists of a collection of files, along with some metadata explaining whatever is needed for the system and the user to know about the package itself and how to handle it. A package can contain one or more programs, but also other kind of data, such as documentation, fonts, artwork, data for other programs, or in general anything that you may need to install on a system.
A package must know how to set up the system when being installed, so that whatever it contains is usable and fits in with the rest of the system. It must also contain information telling the system how to uninstall it, so that the system remains consistent afterwards. It must ensure that whatever it needs to work is already present on the system. It has to provide a description explaining what the package contains, what purpose it serves, and under which license it can be used and distributed. To sum up, it must provide whatever information is needed for both the user and the system to handle it.
Even when they are the minimal unit, a package shall not be seen as something independent of the whole system. The individual packages are not more important than the system as a whole. When developing a package, both its quality, integration with the rest of the system an the compliance to applicable standards must be taken into account. The most important document that specifies how that should happen is the Debian Policy, which also relies on some other Linux standards, such as the File Hierarchy Standard, or the Linux Standard Base.
You can go to http://packages.debian.org/ or http://www.ubuntu.com/packages to get information about the packages in your distribution. From there you can get the list of packages, you can search for the packages with a certain name or description, or the packages that contain a certain file, and you can retrieve information on any of the packages in different releases from your distribution.
This is quite a powerful online tool when you want to find a package for a certain purpose (try finding packages that can handle "gif" files, or "swf" files, or that are related to algebra, to see the availability of different packages in the different versions of the system, and which version of the package goes in each of them for every architecture, to find out the dependencies of a certain package, or for finding out in which package a certain file is. Try to find out which packages you would need to get the command line tool "dos2unix" for converting new line delimiters from DOS to UNIX, or which package you would need for developing OpenGL applications (that means, including the header "GL/gl.h" from C, or linking against the "libGL.so" or "libGL.a" library).
Another powerful tool for finding packages are DebTags. Try to use the Web Interfaces to find a package that suits whatever purpose you want. Try, for example, to find games for kids. As not all the programs in Debian are already tagged, you might find out that not all the possible ones are listed, but in any case it is a powerful tool.