Explain the difference between loading states, error boundaries, and pagination in a data-fetching component.