Support for data sources with heterogeneous cell reuse identifiers

This PR has a solution for the case of an implementation that uses more than one reuse identifier on the data source. This happens when the view is composed by heterogeneous cells.

The idea is to create a new abstract method called  `reuseIdentifierForCellAtIndexPath:` that provides the reuse identifier for a cell on the given index path. This method will be called if the `cellReuseIdentifier` is `nil`, and obviously it must be overridden in this case.

There are some handy new initializers for this case, the only difference is that they do not take a `cellReuseIdentifier` parameter, internally calling the older initializers and passing this parameter as `nil`.