Refactored the implementation of PFDSList to use some object-oriented polymorphism internally.

- Introduced a private class to represent the empty list.
- Overrode all the PFDSStack protocol methods to do the right thing for empty lists.
- Removed all the explicit checks for [self isEmpty] or [self.firstCell == nil] from the non-empty PFDSList implementation.