Add missing calls to declarePosition

Also, validate that blocks have the same number of positions as the
declared positions in the page to catch these issues in the future
Fix PageBuilder.isEmpty()

It was relying on BlockBuilderStatus.isEmpty, which tracks size.
Entry size can be 0 under certain conditions, which causes PageBuilder
to say it's empty when it's not.
Show empty rows for Values in explain