Implement retry on NodeLocked exceptions

This adds the capability to retry node locking when a node is already
locked. Two conductor configuration variables are added to control this
behavior, which can be totally disabled by setting the value for the
node_locked_retry_attempts variable to zero.

A new unit test is added to check that the retry will work after first
getting a NodeLocked exception, then succeeding getting the lock on the
next lock attempt.

Change-Id: I60b099beea1bc3a954a5ab4699e623aaa71ba6c5
Blueprint: add-nodelocked-retry
Add drivers.base.BaseDriver.get_properties()

Adds ironic.drivers.base.BaseDriver.get_properties() which returns a
dictionary of <property>:<description> entries.

The driver interfaces (DeployInterface, PowerInterface, ...) have a
new get_properties() method that returns a dictionary of
<property>:<description>.

These changes are needed in order to provide an API to get driver_info
properties.

Change-Id: I5994e990deb26841633ca26de1a5fb63b743271a
Blueprint: get-required-driver-info
Partial-Bug: #1261915
Merge "Implement retry on NodeLocked exceptions"
Merge "Add drivers.base.BaseDriver.get_properties()"