support declaring internal exchanges

This commit adds support for declaring internal exchanges.

Not sure about the signature change of Exchange#declare_exchange.

I have added the parameter at the last position, to keep it compatible, because the code states this to be a public method. But it would be more natural to have the parameters in same order as the AMQP frame constructor.

Is it really necessary that this is a public method?

I someone calls it, the Exchange instance can go into an inconsistent state (values in `@opts`and some internal instance variable could differ after the call).