You can control the order of your inserted blocks by the node's attribute
after. See http://www.magentocommerce.com/knowledge-base/entry/controlling-block-order to get more info.
But, as you are setting your
demo.demo block as a child of
product.info it will not be rendered as child block, as long as you are not rendering it by
catalog/product/view.phtml (product.info's template file).
Set your block not inside
product.info but outside, right before it by the descripted technique mentioned above:
<block type="demo/demo" before="product.info" name="demo" template="demo/demo.phtml" />
Child blocks are not automatically rendered by iterating through its children. There are just a few block types where this is true. See http://blog.philwinkle.com/the-most-misunderstood-concept-in-magento/ to get an understanding about this and the misconception of blocks in Magento.
When defined in a layout, any block of type core/text_list will automatically render all its children. While core/text will automatically render itself it really only should contain text and therefore is not useful for layout purpose
Any other block type will need to be rendered manually. Provide the
block an alias which can then be passed to getChildHtml, returning the
content which you then echo.
to give you a tl;dr.